将数组指针传递给函数,然后重新分配数组并在 C 中更改其值
Passing an array pointer to a function and then reallocating the array and changing its values in C
我有一个非常基本的问题,我已经尝试回答它好几个小时了,但仍然无法解决问题。
我想在 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] = 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;
}
对于多个维度,请查看
我有一个非常基本的问题,我已经尝试回答它好几个小时了,但仍然无法解决问题。 我想在 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] = 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;
}
对于多个维度,请查看