2017-02-12 8 views
0

変数char **配列を持つSmartArrayの構造体typedefがあります。私は数時間にわたってコードをデバッグしようとしており、多くの進歩を遂げました。しかし、私はこの特定のバグに固執しています。私は上記の配列を印刷する機能を持っています。それは2回印刷され、3回目には全く印刷されません!私は配列にmallocをどのように追加しているのか、これが正しいものではないという印象を持っています。配列の最後のセクションについては、 "Testing Na"と表示されます。何か案は?私は助けに感謝します。ここで構造体へのポインタによって制御される**ポインタの要素の追加と出力

が、私は疑っています機能の一部が原因である、しかし、私はそれを見つけるように見えることはできません://文字列

ここ
printf("approaching malloc\n"); 
    strPtr = malloc(sizeof(char) * (strlen(str) + 1)); 

    if(strPtr == NULL) 
    { 
    return NULL; 
    } 
    printf("made it past malloc!\n"); 
    strcpy(strPtr, str); 
    //if crash probably this code 
    smarty->array[index] = strPtr; 

    if(smarty->array[0] == NULL) 
    { 
    return NULL; 
    } 



    return strPtr; 

のための分のスペースを割り当てる私のテストコードは次のとおりです。

typedef struct SmartArray 
{ 
    // We will store an array of strings (i.e., an array of char arrays) 
    char **array; 

    // Size of array (i.e., number of elements that have been added to the array) 
    int size; 

    // Length of the array (i.e., the array's current maximum capacity) 
    int capacity; 

} SmartArray; 
     int main(void) 
    { 
     int i; char buffer[32]; 

     SmartArray *smarty1 = createSmartArray(-1); 
     printf("Array created\n"); 

      // Print the contents of smarty1. 
      printf("\n-- SMART ARRAY 1: --\n"); 
      printSmartArray(smarty1); 
      printf("Made it past print!\n"); 
      put(smarty1,"Hi, my name is "); 
      put(smarty1, "Hello, my name is"); 
      put(smarty1, "Testing Names"); 
      printf("made it past put!\n"); 
      printf("smart away is now\n"); 
      printSmartArray(smarty1); 
      printf("end of main!\n"); 

私は初心者であるため、私はただ見落としているような気がします。

ここで私はそれがメモリに見えるように取得しようとしている何の絵だ: click here for memory diagram

UPDATE:それはすべての名前を印刷しなかった理由私は考え出したが、プログラムは、印刷atfterセグメンテーションフォールト関数。

+0

コードに2D配列がありません。 'int ** 'もありません。 'int **'のようなものは2D配列ではなく、1つを指すことができないことに注意してください!ポインタへのポインタです。配列の配列とはまったく異なるデータ型です。[ask]を読み、[mcve]を提供します。 – Olaf

+0

@Olaf私は自分のコードに追加しました。 – starlight

+0

あなたは通常、ユーザーに叫んでいますか? –

答えて

0

mallocを使用して配列を拡張しようとしていると思います。 C配列は、一度に1つのストレージブロックのみを指すことができます。 mallocを使用すると、まったく新しいブロックが割り当てられ、smarty->array[index] = strPtrを書き込むときに配列の最後に追加しようとしています。

Cアレイのサイズを拡張する場合は、代わりにreallocを使用してください。これにより、新しい大きなメモリブロックが割り当てられ、既存のコンテンツもコピーされます。

これで問題が解決しない場合は、put機能全体を投稿できますか?

+0

しかし、もし明日の締め切りだとすれば、私はそれを投稿したくないかもしれません。必要に応じて、私は行います。 reallocはポインタに2Dセクションを持たせますか?割り当ては、動的に割り当てられる2D文字「SmartArray」を作成することです。私は上記の写真を追加しました。 Realloc、私には、それはメモリアドレスを完全に変更するように聞こえる。よくわかりません。 – starlight

+0

Reallocを使用すると、既存の配列を動的に展開できます。したがって、5要素の長さの配列から始め、reallocを呼び出すと、10項目の長さにすることができます。配列の内容は新しい配列にコピーされます。最初の配列の位置は変わりますが、実際の文字列を指すポインタはすべて同じになります。 –

+0

アクセスしようとしていないメモリにアクセスしようとしているため、segfaultが発生します。これは、put関数のindex変数が配列の範囲外にあるためです。 SmartArray構造体の配列プロパティを適切に割り当てましたか? –

関連する問題