我试图在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]
将其定义为数组。