2017-10-13 14 views
-2

文字列のリストを入力しようとしています。リストは長さが異なる可能性があるので、動的割り当てを使用しようとします。各文字列は最大20文字です。リストは1つのドットで終わります。私はしばらくの間それに取り組んできましたが、私はセグメンテーションの失敗を続けています。なぜ私は分かりません。私はエラーが私のrealloc/mallocの使用にあると思うが、私はちょうど私が間違ってやっているのか分からない。コードブロックは大規模なプログラムの一部ですが、私はこのブロックを選んで動作させようとしています。それは1つの単語の "リスト"の後にドットが続くようにうまく動作します。 2つ以上の文字列のリストを読み込もうとすると、セグメント化エラーが発生します。 お手数をお掛けします。ありがとうございます!cで動的割り当てを使用している文字列のリストを入力

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char **resizeDynamicArray(char **arr, int newSize){ 
    char **ptr = realloc(arr, newSize*sizeof(char*)); 
    if (ptr==NULL) { 
    printf("Error: memory allocation failed.\n"); 
    exit(-1); 
    } 
    return ptr; 
} 

int input (char ***seq){ 
    int len = 0; 
    char string[21]; 
    *seq=NULL; 

    do{ 
    scanf("%s", string); 
    if (string[0] != '.'){ 
     *seq = resizeDynamicArray(*seq, (len+1)); 
     *seq[len] = malloc(sizeof(char[21])); 
     strcpy((*seq)[len], string); 
     len++; 
    } 
    } while (string[0] != '.'); 
    return len; 
} 

int main(int argc, char *argv[]) { 
    int length; 
    char **words; 

    length = input(&words); 
    for (int i=0; i<length; ++i){ 
    printf("%s\n", words[i]); 
    } 
    for (int i=0; i<length; ++i){ 
    free(words[i]); 
    } 
    free(words); 
    return 0; 
} 
+3

3つ星のプログラマーは、自分のプログラムをデバッグできるはずです。 – EOF

+0

['gdb'](http://www.gnu.org/software/gdb/documentation/)をご覧ください –

+0

EOFにはまったく役に立ちません。私は「3つ星のプログラマー」にはほど遠いです。私はコーディングとコースatmを取るのが初めてです。ありがとうパトリック、私はすでにそれを解決しました。私はとにかくそれを見てみましょう。 – Matt

答えて

0

変更するには、次の行:

*seq[len] = malloc(sizeof(char[21])); 

へ:

(*seq)[len] = malloc(sizeof(char[21])); 

トップレベルの配列のインデックスのことができます前に間接参照する必要のある間接の余分なレベルがあります。

+0

ありがとうございました。それはまさに間違っていたものでした。今は素晴らしい作品です。 – Matt

関連する問題