0

次のような配列があります。

 char* arg[1024];

関数に渡す引数を初期化するために、次のことを行っています。

 arg = (char**)calloc(1024,sizeof(char*)); 

ただし、引数を関数に渡すたびに。最終的にセグメンテーション違反が発生します。この関数は基本的に、非常に単純なコマンドから単語の解析を行っています。

 void parse(char* buffer, char** arg)
 {
   while(*buffer!='\0')
   {
     *arg=buffer;
      arg++;
      while(*buffer!=' ')
      buffer++;

      while(*buffer == ' ')
      {
         *buffer = '\0';
          buffer++;
      }         

   }
 }

メモリ割り当てに何か問題がありますか? またはポインタを渡しますか?

4

3 に答える 3

4
char* arg[1024];

静的に割り当てられた 1024 個のcharポインターの配列を提供します。再度動的に割り当てる必要はありません。だからあなたの行を削除しますcalloc()

割り当ての問題に加えて、別のバグがあります。を見てみましょう:

while(*buffer != ' ')
    buffer++;

次の場合はどうなりbuffer = "test"ますか? あなたのwhile-loop はスペースを見つけられず、外側で反復を続けbufferます。あらゆる種類の未定義の動作が発生します...

これを修正するには、文字列ターミネータも確認する必要があります。

while(*buffer != 0 && *buffer != ' ')
    buffer++;
于 2013-01-10T09:49:04.507 に答える
1

あなたの場合、 arg はすでに割り当てられています。あなたはそれが1024要素の大きさである必要があると言います-それは静的に割り当てられます

=> を省略してchar *arg[1024]に置き換えますchar **arg

于 2013-01-10T09:51:25.827 に答える
1

char* arg[1024];char ポインタ の配列です。

arg = (char**)calloc(1024,sizeof(char*));間違っている。新しく割り当てられたメモリ アドレスを に割り当てることはできませんarg

文字列の配列を作成したい場合は、次のようにします: (これが必要だと思います)

char* arg[1024];
arg[i] = (char*)calloc(1024,sizeof(char)); 

iインデックスです。

あなたは言いますが、 ステートメントsegmentation fault.のコンパイルエラーが発生するはずだと思います。エラー: 割り当て時に互換性のない型arg = (char**)calloc(1024,sizeof(char*));

のエラーにも気付きました parse()。(Vegerが回答)文字列を解析するために関数を
使用することもできます。ここで私の回答はこの目的に役立ちます。strsep()buffer

于 2013-01-10T09:49:12.767 に答える