c - 动态内存分配和函数传入

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

如何在另一个函数中更新它?

最佳答案

数组下标运算符[]的优先级高于指针取消引用运算符*。请参阅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/

相关文章:

Javascript 通过标识符引用对象还是直接引用它?

c - tcmalloc/jemalloc 和内存池之间有什么区别(以及选择的理由)?

java - Eclipse RCP : How to increase heap size for my RCP application?

c - 如何使用 malloc.h header 为结构指针分配内存?

C : Pointers and functions 2DArray

c - Base64 解码不工作

c - 用 pthreads 杀死线程 - C

c - 内存分配阈值(mmap 与 malloc)

c - 软实时 Linux 调度

c++ - 像这样使用 `const char *` 返回字符串是否合法?