gpt4 book ai didi

c - 第二次调用后重新分配失败

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

我正在尝试读取要排序的单词列表,我从一个相当小的数组(10 个元素)开始,然后如果当前容量不是,则希望将数组的大小增加 10足够的。这似乎适用于第一个 realloc,但当我尝试再次调用 realloc 时,我收到了 SIGABRT。我确信这是一件我没有看到的简单事情,但我似乎无法弄清楚。这是我的程序:

int main(int argc, char *argv[]){
char *string = malloc(100);
// Array of pointers starting with 100 elements
char **toSort = malloc(100*sizeof(char *));
if(toSort == NULL) {
exit(1);
}

for(int i = 0; i < 100; i++) {
// Each string can be up to 100 characters long
toSort[i] = malloc(101);
if(toSort[i] == NULL) {
exit(1);
}
}

// Get all lines in the file
int counter = 0;
int max = 10;
char *toAdd;


FILE *txt = fopen("wlist0.txt", "r");


while(fgets ( string, 100, txt ) && counter < max) {;

toAdd = malloc(100);
if(toAdd == NULL) {
exit(1);
}
strcpy(toAdd, string);

toSort[counter] = string;
counter++;

//if the array needs to be enlarged
if(counter == max) {
char **new = realloc(toSort, (max+10) * sizeof(char));
if(new == NULL) {
exit(1);
}
for(int i = max; i < max + 10; i++) {
toSort[i] = malloc(101);
if(toSort[i] == NULL) {
exit(1);
}
}
toSort = new;
max += 10;
}
};

for(int i = 0; i < max; i++) {
char *word = toSort[i];
printf("%s", word);
}

for(int i = 0; i < max; i++) {
free(toSort[i]);
}

free(toSort);


return 0;
};

就像我的评论所说,我的字符串的最大长度为 100 个字符。我想我也可以为字符串动态分配内存,但是当我让其他重新分配工作时我会担心这一点。任何帮助将不胜感激。

最佳答案

realloc() 释放/修改它指向的内存后,此代码将值分配给 toSort:

     //if the array needs to be enlarged
if(counter == max) {
char **new = realloc(toSort, (max+10) * sizeof(char));
if(new == NULL) {
exit(1);
}
for(int i = max; i < max + 10; i++) {
toSort[i] = malloc(101); <--- toSort is invalid here
if(toSort[i] == NULL) {
exit(1);
}
}
toSort = new;
max += 10;
}

这样效果会更好:

     //if the array needs to be enlarged
if(counter == max) {
char **new = realloc(toSort, (max+10) * sizeof( *new )); <-- fixed here, too
if(new == NULL) {
exit(1);
}
toSort = new;
for(int i = max; i < max + 10; i++) {
toSort[i] = malloc(101);
if(toSort[i] == NULL) {
exit(1);
}
}
max += 10;
}

您的代码中可能存在其他错误。我还没有完全检查过。

关于c - 第二次调用后重新分配失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50087402/

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