【问题标题】:Passing an array pointer to a function and then reallocating the array and changing its values in C将数组指针传递给函数,然后重新分配数组并在 C 中更改其值
【发布时间】:2021-12-08 19:38:01
【问题描述】:

我有一个非常基本的问题,我尝试回答了好几个小时,但它仍然不起作用。 我想在 main 中 malloc 一个数组,将它传递给另一个函数,重新分配它,然后更改它的值。 为什么以下代码有效:

void fun(int **array, int *size) {
    *array = (int *) realloc(*array, *size * sizeof(int));
    *array[0] = 1;
  
    return;
}

int main() {
    int size = 5;
    int *array = (int *) malloc(2 * sizeof(int));
    fun(&array, &size);
  
    return 0;
}

...但是一旦我尝试像这样更改数组 [1]:

void fun(int **array, int *size) {
    *array = (int *) realloc(*array, *size * sizeof(int));
    *array[0] = 1;
    *array[1] = 2;

    return;
}

int main() {
    int size = 5;
    int *array = (int *) malloc(2 * sizeof(int));
    fun(&array, &size);
  
    return 0;
}

...它不再起作用了。它给了我分段错误大小为 4 的无效写入

【问题讨论】:

  • *array[0]:检查运算符优先级,应该是(*array)[0]

标签: arrays c segmentation-fault malloc realloc


【解决方案1】:

*array[0] = 1; 中,[] 运算符具有最高优先级,这意味着它被解释为首先对int** 进行指针运算,然后取消引用它。它相当于**(array + 0) = 1,这不是你想要的。

对于一维数组,您可以简单地这样做:

#include <stdlib.h>

void fun (int** array, int size)
{
  int* tmp = realloc( *array, sizeof(int[size]) );
  if(tmp == NULL)
  {
    // error handling here
  }
  *array = tmp;

  (*array)[0]=1;
  (*array)[1]=2;
}

int main (void)
{
  int* array = malloc(2*sizeof *array);
  int size = 5;
  fun(&array, size);

  free(array);
  return 0;
}

多维度请查看Correctly allocating multi-dimensional arrays

【讨论】:

    猜你喜欢
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    相关资源
    最近更新 更多