gpt4 book ai didi

c - C故障中的二维动态数组

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:52 24 4
gpt4 key购买 nike

我必须用动态二维数组 编写一个程序,但我遇到了问题。一切正常,直到我尝试打印超过 4 行的数组。最多 4 行看起来都不错,但第 5 行最后一行的长度扩展到 7631472,这会导致段错误。

编辑:

谢谢大家的回复,我按照你的建议做了,。但是我发现问题出在其他地方,它在“长度”数组中。每次当我添加 mroe 而不是这 4 个项目时,它就会开始填充内存中的一些随机值。

代码:

#include <stdio.h>
#include <stdlib.h>

int addRow(int i, int **array2d, int * lengths) {
int len, value;
int counter;
i++;
scanf("%d", &len); /*write the length of each row*/
*(array2d + i-1) = malloc(sizeof (int) * len);
*(lengths + i-1) = len;
for(counter = 0; counter < len; counter++) {
scanf("%d", &value); /*write each element in row*/
*(*(array2d+i-1)+counter) = value;
}
return i;
}

void print(int *i, int **array2d, int * lengths) {
int counter, counter2;
for(counter = 0; counter < *i; counter++) {
for(counter2 = 0; counter2 < *(lengths+counter); counter2++) {
printf("%d ",*(*(array2d+counter)+counter2));
}
printf("\n");
}
}

void end(int *i, int **array2d, int * lengths, char * word) {
int counter;
for(counter = 0; counter < *i; counter++)
free(*(array2d + counter));
free(array2d);
free(lengths);
free(word);
}

int main() {
int ** array2d = (int**) malloc (0*sizeof(int*));
int * lengths = (int*) malloc (0*sizeof(int)); /*length of each row*/
char * word = (char*) malloc (3*sizeof(char));
int i, isEqual; /* i - number of rows */
i = 0;

while(1) {
scanf("%s", word);
isEqual = strcmp(word, "add");
if(!isEqual)
i = addRow(i, array2d, lengths);
isEqual = strcmp(word, "print");
if(!isEqual)
print(&i, array2d, lengths);
isEqual = strcmp(word, "end");
if(!isEqual) {
end(&i, array2d, lengths, word);
return 0;
}
}
return 0;
}

最佳答案

如果我们阅读 malloc 的说明,主要是分配大小为 0 的数组:

malloc() 函数分配大小字节并返回指向已分配内存的指针。内存未初始化。如果 size 为 0,则 malloc() 返回 NULL 或稍后可以成功传递给 free() 的唯一指针值。

这意味着您创建了一个未定义的行为,因此它可以在所有情况下工作,因为它永远不会工作。

取而代之的是,您应该分配大小为 1 的数组,然后在需要时使用 realloc 增加大小。

关于c - C故障中的二维动态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43307896/

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