通过指针在多个函数中更改数组

时间:2018-09-29 12:04:04

标签: c arrays pointers

我有以下代码,并且我想更改通过这样的多个函数传递的数组:

int main(void)
{
    int *arr, n;

    scanf("%d", &n);
    arr = (int*)malloc(n*sizeof(int));
    for (i = 0; i < n; i++)
    //scanning into array

    func1(arr, n);
}
  

现在,我希望每个循环更改数组,然后在下一个循环中使用更改的arr等

void func1(int *x, int h)
{
    for (int i = 1; i < height; i++)
        change(&x, h, i);
}
  

在这里,我需要将原始数组更改为与gArr相同或具有相同的值

void change(int **x, int h, int i) {


    int *gArr = (int*)malloc(h*sizeof(int));
    //doing some operations


    //here I want to somehow change the original array to be gArr 
    //or to have the same values as gArr
    *x = gArr;
}

我尝试了多种方法,但由于某种原因,我无法以正确的方式获得正确的结果。

4 个答案:

答案 0 :(得分:0)

您的通话图是:

main(void)
    func1(int *x)
        change(int **x)

因此,如果您将指针变量从main传递到func1change,然后更改该变量(即指向的内存位置),那么还必须传递其地址到func1,否则main永远不会观察到更改:

main(void)
    func1(int **x)
        change(int **x)

...并且不要忘记free中的change原始数组。

答案 1 :(得分:0)

您需要区分指向数组的指针和该数组的元素。让我们首先了解一下您现在正在做什么:

int main(void)
{
    int *arr, n;

    scanf("%d", &n);
    arr = (int*)malloc(n*sizeof(int));
    // ...
    func1(arr, n);
}

int *arr在函数int的范围内声明一个指向main()的指针。 稍后在某个指针处,将此指针传递给函数func1。现在C是按值传递语言,这意味着func1获得arr的值,并且该值是动态分配的数组的地址。这使您可以操纵arr指向的元素,但不能操纵arr本身。因此,如果在func1内,您可以:

void func1(int *arr, int n) {
   arr = dynamic_pointer_to_another_array();
}

只有arr内部的func1会改变,而main中的change()不会改变。现在您已经部分地了解了这一点,因为您的func1()函数采用了指向指针的指针,但是在change(&arr, h, i); 中,您有:

&

您可能会认为这里的arr是从main传递arr的地址,但实际上是从func1传递func1的地址,因为再次,C是一种价值传递语言。每次将值传递给函数时,它都会复制到该函数的作用域中,并且对该值的任何操作都不会反映在调用者中。

一个简单的解决方案是将int **arr改为int *arr而不是change(arr, h, 1); ,这样您就可以做到:

change

*arr = new_array(); 内,您可以执行以下操作:

int *arr = malloc(sizeof(int) * N);
arr = new_array();

之所以可行,是因为然后您传递了指针的地址而不是指针本身,并且可以通过指针的地址来更改指针指向的内容。

重要提示

您的代码还有另一个大问题。您正在动态分配一个数组,然后尝试将指向该数组的指针重新分配给另一个数组。这肯定会导致内存泄漏和指针悬空。做

free

肯定会导致内存泄漏,因为您永远不会在该指针上使用arr来释放内存,并且在将其重新分配给另一个数组之后,您将丢失对它的所有引用。您有几种选择方法。如果需要增加realloc的大小,则可以使用free而不是分配新的数组。这样,您仍然只需要404 erroe一次。

答案 2 :(得分:0)

因此问题是,当您处理在主数组中创建的数组的副本时,更改地址内部的值不会产生$searchResponse = $youtube->search->listSearch('id,snippet', array( 'maxResults' => _MAX_, 'type' => "video", 'order' => 'date', "channelId" => "id_channel_1,id_channel_2, ..." )); 的正确影响。

我已经看到您在函数HOW COULD IT BE UPDATED的参数列表中使用了int **类型。还有使用此功能的原因,因为更改可以对传递的数组生效!

以同样的方式,您还应该像func1(int **)这样在内部使用int **,以便操作可以反映在原始对象上。

答案 3 :(得分:0)

我以某种方式想出了办法:

void func1(int *x, int h)
    {
        for (int i = 1; i < height; i++)
            change(x, h, i);
    }


void change(int *x, int h, int i) {

    int *gArr = (int*)malloc(h*sizeof(int));
     //doing some operations

    memcpy(x, gArr, h*sizeof(int));
    free(gArr);
}

memcpy做的很好,但是我不确定它是否正确。