c-我对结构数组的malloc和realloc做错了什么



我试图在C中构建一个结构数组,而不定义数组最大大小的长度。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct text {
char *final;
} text;
int main() {
int n, sizearray = 10, i;
char *str;
text *testo;
testo = (text *)malloc(sizeof(text) * sizearray);
fgets(str, 1024, stdin);
i = 0;
while (str[0] != 'q') {
if (i == sizearray - 1) {
testo = (text *)realloc(testo, sizearray * 2 * sizeof(text));
}
n = strlen(str);
n = n + 1;
testo[i].finale = (char *)malloc(sizeof(char) * n);
strcpy(testo[i].finale, str);
i++;
fgets(str, 1024, stdin);
}
for (i = 0; i < sizearray; i++)
printf("%s n", testo[i].finale);
return 0;
}

这给了我

process finished with exit code 139 (interrupted by signal 11:SIGSEV).

我做错了什么?

您的代码中存在多个问题:

  • [major]str是一个未初始化的指针。您应该使它成为用char str[1024]定义的char的数组
  • [major]将数组大小增加一倍时,不会调整sizearray,因此在首次尝试i = 9后,永远不会重新分配数组
  • [major]最后一个循环进入sizearray,但在数组的末尾可能有许多未初始化的条目。您应该在存储到数组中的最后一个条目处停止
  • 您还应该检查fgets()的返回值,以避免文件过早结束时出现无限循环
  • 您应该测试潜在的内存分配失败,以避免未定义的行为

这是一个修改后的版本:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct text {
char *finale;
} text;
int main() {
char str[1024];
text *testo = NULL;
size_t sizearray = 0;
size_t i, n = 0;
while (fgets(str, sizeof str, stdin) && *str != 'q') {
if (n == sizearray) {
/* increase the size of the array by the golden ratio */
sizearray += sizearray / 2 + sizearray / 8 + 10;
testo = realloc(testo, sizearray * sizeof(text));
if (testo == NULL) {
fprintf(stderr, "out of memoryn");
return 1;
}
}
testo[n].finale = strdup(str);
if (testo[n].finale == NULL) {
fprintf(stderr, "out of memoryn");
return 1;
}
n++;
}
for (i = 0; i < n; i++) {
printf("%s", testo[i].finale);
}
for (i = 0; i < n; i++) {
free(testo[i].finale);
}
free(testo);
return 0;
}

str未初始化。用malloc分配内存,或者用char str[1024]将其定义为数组。

相关内容

  • 没有找到相关文章

最新更新