我按如下方式分配内存。还尝试在另一个函数中更新它。
int main() {
int* ptr = (int*)malloc(sizeof(int)*3);
ptr[0] = 0;
ptr[1] = 1;
ptr[2] = 2;
modifyArr(&ptr, 2);
}
void modifyArr(int** arr, int arrLen)
{
printf("Before modified\n");
printArray(*arr, arrLen);
for (int i = arrLen; i >= 0; i--)
{
*arr[i] = i; // here is error
}
printf("After modified\n");
printArray(*arr, arrLen);
}
那么如何在另一个函数中修改这个数组呢?
如果我的数组是固定数组:
int arr[] = { 0,1,2 };
如何在另一个函数中更新它?
最佳答案
数组下标运算符[]
的优先级高于指针取消引用运算符*
。请参阅order of precedence of operators in C 。结果是:
*arr[i] = i;
真正的意思是:
*(arr[i]) = i;
这意味着您将 arr
视为指针数组,而不是指向数组的指针。结果,您最终写入了错误的位置并调用 undefined behavior .
您需要在 *arr
两边加上括号才能得到您想要的内容:
(*arr)[i] = i;
但是,由于您只是更新指针指向的内存,而不是实际修改指针,因此不需要传递指针的地址。直接传入即可:
void modifyArr(int* arr, int arrLen)
{
printf("Before modified\n");
printArray(arr, arrLen);
for (int i = arrLen; i >= 0; i--)
{
arr[i] = i;
}
printf("After modified\n");
printArray(arr, arrLen);
}
并这样调用它:
modifyArr(ptr, 2);
您可能还想修改 printArray
来执行相同的操作。
关于c - 动态内存分配和函数传入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49199325/