2011-11-09 60 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;