gpt4 book ai didi

c - 在 C 中意外修改的结构中动态分配的数组

转载 作者:行者123 更新时间:2023-11-30 15:38:15 25 4
gpt4 key购买 nike

我最近遇到了动态分配数组的概念,在应用它时我遇到了以下问题。

在一个结构中,我定义了一些稍后分配的指针:

typedef struct CELL {
int total;
int* number;
char** type;
}CELL;

在函数中,该结构体通过 malloc() 分配内存,然后通过以下方法为两个指针分配一维和二维数组:

int iallocate1D(int** arr, int m){
if ( (*arr = malloc(m*sizeof*arr))==NULL ) return 1;
return 0;
}

int callocate2D(char*** arr, int m, int n){
int i;
*arr = malloc(m*sizeof*arr);
if (*arr==NULL) return 1;
for(i=0;i<m;i++){
(*arr)[i] = malloc(n*sizeof(*arr)[i]);
if ((*arr)[i]==NULL) return 2;
}
return 0;
}

在以 CELL* 作为参数的函数中,我初始化了所有数组:

int loadCell(CELL** cell){
*cell = malloc(sizeof*cell);
iallocate1D(&(*cell)->number, 2); // 1D array of length 2
callocate2D(&(*cell)->type, 2, 3); // 2D array of size 2*3
}

到目前为止,一切都很好,我扫描了一些值来填充两个数组的每个元素。我用 printf 测试过,它们看起来没问题。问题来了,当我修改了

的值时
(*cell)->total = 1;

我认为这不相关,二维字符数组也被修改了。在此修改之前 char[1][0] == 'L',但在此修改之后 char[1][0] == '\3'。我打印了每个元素,发现只有这个元素被修改了。很奇怪,但我无法弄清楚哪里出了问题,因为该行是所有数组元素的两个打印之间唯一的东西。我怀疑我的动态分配是错误的,但是我一开始就不应该将某些值扫描到数组中。

任何提示将不胜感激。提前致谢。

最佳答案

*arr = malloc(m*sizeof*arr)

这会分配 m 个大小为 *arr 的对象,但您需要 **arr。其他一些分配同样缺少一定程度的间接性。他们应该是:

allocate1D中:

*arr = malloc(m * sizeof **arr)

callocate2D中:

*arr = malloc(m * sizeof **arr);

(*arr)[i] = malloc(n * sizeof *(*arr)[i]);

loadCell中:

*cell = malloc(sizeof **cell);

关于c - 在 C 中意外修改的结构中动态分配的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21862513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com