2011-11-09 63 views
-1

这里是一个非常简单的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)

+0

谢谢,我不知道为什么我错过了这一点,我知道它必须是非常愚蠢的东西! – ryyst

3

当您执行realloc时,您将为N个字符分配空间,而不是指向char的N个指针。

再说一遍,既然你只是想要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;