我有以下代码,并且我想更改通过这样的多个函数传递的数组:
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;
}
我尝试了多种方法,但由于某种原因,我无法以正确的方式获得正确的结果。
答案 0 :(得分:0)
您的通话图是:
main(void)
func1(int *x)
change(int **x)
因此,如果您将指针变量从main
传递到func1
到change
,然后更改该变量(即指向的内存位置),那么还必须传递其地址到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
做的很好,但是我不确定它是否正确。