我对结构数组的 malloc 和 realloc 做错了什么?
What am I doing wrong with malloc and realloc of array of struct?
我试图在 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).
我做错了什么?
str
未初始化。使用 malloc
分配内存或使用 char str[1024]
.
将其定义为数组
您的代码中存在多个问题:
- [major]
str
是未初始化的指针。您应该将其设为 char
的数组,定义为 char str[1024]
.
- [major] 当你将数组的大小加倍时,你不会调整
sizearray
,因此你永远不会在 [=] 的初始尝试后重新分配数组15=].
- [major] 最终循环转到
sizearray
但数组末尾可能有许多未初始化的条目。您应该在存储到数组中的最后一个条目处停止。
- 您还应该检查
fgets()
的 return 值以避免文件过早结束时的无限循环。
- 您应该测试潜在的内存分配失败以避免未定义的行为。
这是修改后的版本:
#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 memory\n");
return 1;
}
}
testo[n].finale = strdup(str);
if (testo[n].finale == NULL) {
fprintf(stderr, "out of memory\n");
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;
}
我试图在 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).
我做错了什么?
str
未初始化。使用 malloc
分配内存或使用 char str[1024]
.
您的代码中存在多个问题:
- [major]
str
是未初始化的指针。您应该将其设为char
的数组,定义为char str[1024]
. - [major] 当你将数组的大小加倍时,你不会调整
sizearray
,因此你永远不会在 [=] 的初始尝试后重新分配数组15=]. - [major] 最终循环转到
sizearray
但数组末尾可能有许多未初始化的条目。您应该在存储到数组中的最后一个条目处停止。 - 您还应该检查
fgets()
的 return 值以避免文件过早结束时的无限循环。 - 您应该测试潜在的内存分配失败以避免未定义的行为。
这是修改后的版本:
#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 memory\n");
return 1;
}
}
testo[n].finale = strdup(str);
if (testo[n].finale == NULL) {
fprintf(stderr, "out of memory\n");
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;
}