动态内存分配和传入函数

时间:2018-03-09 17:43:11

标签: c memory

我按如下方式分配内存。还尝试在另一个函数中更新它。

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 };

如何在其他功能中更新?

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。因为您访问过的是未分配的内容。