2017-03-12 6 views
-3

配列splittedにアクセスしようとすると、Segfaultに次のコードがあります。私は間違った方法でポインタの配列を再割り当てしていますか?charへのポインタの配列を再割り当て

void allocate (char** splitted) { 
    splitted = malloc(sizeof(char*)); 
    for (int i = 0; i < 3; i++) { 
     splitted = realloc(splitted, (i + 1) * sizeof(char*)); 
     splitted[i] = "asd"; 
    } 
} 

int main() { 
    char** splitted = NULL; 
    allocate(splitted); 
    for (int i = 0; i < 3; i++) { 
     printf("%s", splitted[i]); 
    } 
    return 1; 
} 
+0

ループの前に必要なサイズを 'malloc'するのではなく、そのようなループで' splitted'を拡張しようとする動機は何ですか? –

+0

'allocate'の結果を使用して、現在は' void'を使って新しいシーケンスアドレスを返します。 – WhozCraig

+0

あなたはライブラリのヘッダーを含めていません。あなたが担当者を持っているという理由だけで、 "わかった"とは思わないでください。あなたはよく知っているはずです。 –

答えて

2

はい、間違った方法で配列を再割り当てします。

splittedに渡されていることを忘れています。したがって、関数内の値の変更は呼び出し元には見えません。

したがって、関数を変更して余分な間接レベルを追加してください。

void allocate (char*** splitted) 
{ 
    *splitted = malloc(sizeof(char*)); 
    for (int i = 0; i < 3; i++) 
    { 
     *splitted = realloc(splitted, (i + 1) * sizeof(char*)); 
     (*splitted)[i] = "asd"; 
    } 
} 

/* to call it in main() */ 

allocate(&splitted); 

または他のいくつかのノートが続く新たな価値

char *allocate (char** splitted) 
{ 
    splitted = malloc(sizeof(char*)); 
    for (int i = 0; i < 3; i++) 
    { 
     splitted = realloc(splitted, (i + 1) * sizeof(char*)); 
     splitted[i] = "asd"; 
    } 
    return splitted; 
} 

/* to call it in main() */ 

splitted = allocate(splitted); 

を返すように変更します。

あなたのコードの前に#include <stdlib.h>があることを前提としています(それ以外の場合、malloc()realloc()の使用はコンパイルされません)。将来的には、MCVEを提供してください。あなたが手助けしようとする人々は、あなたが残したことについて前提や推測をする必要はありません。

realloc()NULLを受け入れることができるので、関数内のmalloc()の呼び出しは必要ありません。

また、realloc()はループ内にある必要はありません。ループが行われる前に単一のrealloc()が実行されます - 最終的に意図されたサイズを供給するだけです。

realloc()malloc()のような関数の戻り値を確認すると、エラーの表示が返される可能性があります。明らかに、戻り値をチェックする場合は、エラーを賢明に処理する必要もあります。

コードでmalloc()/realloc()を使用してメモリを割り当てているため、メモリも解放する必要があります。たとえばの末尾はmain()です。はい、近代的なオペレーティングシステムのクリーンアップ - すべてのシステムがそうでないことを除いて - free()を使用していないので、取得する悪い習慣です。また、コードを再利用する場合(たとえば、main()の名前を変更して他の関数から呼び出す場合など)、メモリリークが発生します。

関連する問題