这是一个非常简单的C程序,我无法弄清楚它崩溃的原因:
int main () {
size_t argc = 2;
char **argv = malloc(argc * sizeof(char *));
for (int i = 0; i < 20; i++) {
if (i >= argc) {
argc *= 2;
argv = realloc(argv, argc);
}
argv[i] = strdup("hello world!");
}
for (int i = 0; i < 20; i++) {
printf("argv[%d] = \"%s\"\n", i, argv[i]); // it crashes on this line
free(argv[i]);
}
free(argv);
}
答案 0 :(得分:6)
argv = realloc(argv, argc);
尺寸错误;你需要argc * sizeof(*argv)
。
答案 1 :(得分:3)
当你执行realloc
时,你为N个字符分配空间而不是N个指向char的指针。
然后再说一次,鉴于你只想要20个项目的空间,为什么不开始为20个项目分配空间,将数据放在那里,并完成它?
#define size 20
char **argv = malloc(size * sizeof(char *));
if (argv == NULL) {
fprintf(stderr, "Allocation failed!");
return 1;
}
for (int i=0; i<size; i++)
argv[i] = strdup("hello world!");
另请注意,realloc
可以/将在发生故障时返回空指针,因此您通常希望执行以下操作:
char **temp = realloc(old_ptr, new_size);
if (temp != NULL)
old_ptr = temp;