2

文字列の配列を作成しようとしてrLineいます。stdinから行を読み取る関数があり、入力された各行を配列に保存する必要がありますが、入力された文字列の行数がわかりません。したがって、それらを格納するために配列サイズを動的に増やす必要があるので、次のようなコードを記述しました。

char *res[2], *old = res;
while( 1 ){
  line = rLine( stdin ), len = strlen( line );
  res[row] = (char*)malloc( len + 1);
  strcpy( res[row++], line);
  res = (char**) realloc( res, row ); /* adding 1 more row, not sure adding size row? */
  if ( /*some cond*/ ) break;
}

しかし、このコードは機能していないようです。配列を正しく宣言してサイズを大きくするにはどうすればよいでしょうか。

4

1 に答える 1

3

コメントで述べたように、ポインターの配列はポインターへのポインターとは異なります。割り当てられたメモリをアレイに割り当てようとすることはできません。

res使用する前に、ポインタへのポインタとして宣言し、ループの最初にメモリを割り当てる必要があります。

このように試してみてください:

char **res = NULL, *old = res;
while( 1 ){
  line = rLine( stdin ), len = strlen( line );
  res = (char**) realloc( res, sizeof(char**) * (row + 1) ); /* adding 1 more row, not sure adding size row? */
  res[row] = (char*)malloc( len + 1);
  strcpy( res[row++], line);
  if ( /*some cond*/ ) break;
}

ほとんどの状況で配列はポインタに減衰しますが、その下では非常に異なる方法で処理されることに注意してください。

于 2012-11-20T22:48:51.603 に答える