我按如下方式分配内存。还尝试在另一个函数中更新它。
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 };
如何在其他功能中更新?
答案 0 :(得分:1)
数组下标运算符[]
的优先级高于指针解除引用运算符*
。请参阅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
来执行相同操作。
答案 1 :(得分:0)
当你记住两件事 - 你想要得到什么以及如何得到它时,带指针的东西非常简单?
在这里,您希望获得已分配的连续元素内存。你怎么得到它?是的,你使用[]
和*
是对的,但是再次有一个被称为优先级的东西。 []
的优先级高于*
。所以你根据需要*(arr[i])
写了(*arr)[i]
。首先获取指针然后使用[]
获取元素。
在这里,您实现了所谓的undefined behavior。因为您访问过的是未分配的内容。