2011-11-09 16 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

おかげで、私は知らない。

#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は、/、障害が発生した場合にNULLポインタを返しますことに注意しますなぜ私はそれを逃した。私はそれが本当にばかげた何かでなければならないことを知っていた! – ryyst

3

reallocを実行すると、N個のcharの代わりにN個の文字のための領域が割り当てられます。

もう一度、とにかく20個のアイテムのスペースが必要な場合は、20個のアイテムのスペースを割り当ててそこにデータを置いてやりなおしてみてください。

char **temp = realloc(old_ptr, new_size); 
if (temp != NULL) 
    old_ptr = temp;