はい、間違った方法で配列を再割り当てします。
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()
の名前を変更して他の関数から呼び出す場合など)、メモリリークが発生します。
ループの前に必要なサイズを 'malloc'するのではなく、そのようなループで' splitted'を拡張しようとする動機は何ですか? –
'allocate'の結果を使用して、現在は' void'を使って新しいシーケンスアドレスを返します。 – WhozCraig
あなたはライブラリのヘッダーを含めていません。あなたが担当者を持っているという理由だけで、 "わかった"とは思わないでください。あなたはよく知っているはずです。 –