将数组动态分配到带有指针参数的函数中

Posted

技术标签:

【中文标题】将数组动态分配到带有指针参数的函数中【英文标题】:Dynamic allocation of an array into a function with pointer parameters 【发布时间】:2018-07-09 03:16:03 【问题描述】:

我在通过一系列函数完成通过指针传递数组时遇到问题。我使用动态分配创建一个函数来创建它。即使这是成功的,我也无法让它通过将指针作为参数的函数。这些函数返回平均中位数和众数并已完成。但是,在将它们转换为指针语法时,我无法传递它们。提前感谢您的帮助。

#include <iostream>
#include <cstdlib>


using namespace std;
int students;
int * studentarray;
int  stumode;
double  stuavg;
int  stumed;
int arr;


int mode(int *[], int );
double average(int *[], int);
double median(int *[], int);
void selectSort(int [], int);
void swap(int *, int *);
int makeArray(int*, int);

int main()

    studentarray = &arr;
    cout << "How many students are there?" << endl;
    cin >> students;

    makeArray(studentarray, students);

    for (int i = 0; i < students; i++) 
        cout << "How many movies did student " << i + 1 << " view?" << endl;
        cin >> studentarray[i];
    

    selectSort(studentarray, students);
    stumode = mode(&studentarray, students);
    stuavg = average(&studentarray, students);
    stumed = median(&studentarray, students);

    cout << "The array has been sorted in ascending order." << endl;
    cout << "The mode is " << stumode << "." << endl;
    cout << "The mean is " << stuavg << "." << endl;
    cout << "The median is " << stumed << "." << endl;

    delete[] studentarray;

    return 0;


int mode(int *arr, int size)

    if (size <= 0) return 0;

    int most = 0, position = 0, most_count = 0;
    int counter = 1;
    for (int i = 1; i < size; i++) 
    
        if (* (arr +  i) != * (arr + position) ) 
        
            if (counter > most)
            
                most = counter;
                most_count = 0;
            
            else if (counter == most) most_count++;
            position = i;
            counter = 0;
        
        else counter++;
    
    if (most_count) return 0;
    else return * ( arr + position );


double average(int *arr, int size)

    if (size <= 0) return 0;
    int total = 0;
    for (int i = 0; i < size; i++) 
        total += *(arr + i);
    
    return (double)total / size;


double median(int *arr, int size)

    if (size <= 0) return 0;
    if (size % 2 == 0)
        return (double) (* (arr + (size + 1) / 2));
    else 
        int mid = size / 2;
        return (double)(* (arr + mid) + * (arr + mid + 1) / 2);
    
    return 0;



void selectSort(int arr[], int size)

    int min;
    for (int i = 0; i < size - 1; i++)
    
        min = i;
        for (int j = i + 1; j < size; j++)
        
            if ( arr[j] < arr[min])
            
                min = j;
            
        
        swap(&arr[min], &arr[i]);
    

 

void swap(int *one, int *two) 
    int temp = *one;
    *one = *two;
    *two = temp;


int makeArray(int *arr, int size)

    arr = new int[size];
    return *arr;

【问题讨论】:

【参考方案1】:

您对makeArray 的实现不正确。

int makeArray(int *arr, int size)

    // Allocates memory and assigns it to arr.
    // This is a local change to arr. The value of the variable in
    // main remains unchanged.
    arr = new int[size];

    // Returns an uninitialized value.
    return *arr;

    // The memory allocated in the previous line is now a memory leak.

您可以使用以下方法使其更简单:

int* makeArray(int size)

   return new int[size];

并在main 中使用它作为:

arr = makeArray(students);

但是,我不认为这比使用更好:

arr = new int[students];

如果你这样做,makeArray 就变得不必要了。如果makeArray 需要额外的代码来用一些值填充数组,它会很有用。否则,它不会为您的程序添加任何有用的功能。


说了这么多,最好使用std::vector,而不是在自己的代码中管理动态分配的内存。你会使用:

std::vector<int> arr(students);

附言

我没有查看您的其余代码。可能还有其他错误。

【讨论】:

感谢您对我简单的复杂性的讲座。我重新启动了我的视觉工作室并解决了这个问题。然后我能够自己调试一次。谢谢。 @BrianMoore,不客气。很高兴我能提供帮助。

以上是关于将数组动态分配到带有指针参数的函数中的主要内容,如果未能解决你的问题,请参考以下文章

如何从函数返回动态分配的指针数组?

指针做参数的动态内存分配与二重指针(上)

指针做参数的动态内存分配与二重指针(下)

怎么动态分配指针数组

将二维数组复制到函数外部动态分配的二维数组

尝试使用动态内存分配创建节点指针数组