1

既知のサイズの配列を宣言しましたが、

typedef struct{
  ......
  char * buffer[height+1];    //height is a constant int
  ......} args;

int main{
 args * info;
 info = malloc (sizeof(args));
 char* output_buffer[width][height+1];    //width is also a constant int >= 4
 output_buffer[2] = malloc (sizeof(char)*char_per_line*(height+1)); // error same as below
 info->buffer = output_buffer[2];    // I know it's wrong. incompatible types in assignment
....}

数値は任意であり、説明のために使用されています。

私がやっていることは、 to のアドレスを割り当ててoutput_buffer[width]から、サイズの配列のデータを生成するスレッドに引数としてinfo->buffer渡すことです。各スロットには、長さの cstring があります。これらの cstring は に保存されます。infoheight+1char_per_lineoutput_buffer[2]

output_buffer[2]タイプのポインタではないここで混乱していchar*[height+1]ますか?では、メモリのアドレスをそこに割り当てることができないのはなぜmallocですか?

また、配列を配列に割り当てることができないことはわかっていますが、コードを希望どおりに機能させるにはどうすればよいですか? char**解決策がasを使用することである場合、char*[height+1]どうすれば にアクセスできますinfo->buffer[height]か?

前もって感謝します!

4

3 に答える 3

1

あなたが指定している要件に応じて、これはあなたがする必要があることです

/* This is a 2D array of pointers. */
char* output_buffer[width][height+1]; 

for ( int i =0; i< width; i++ )
    for ( int j=0; j <height+1; j++ )
        output_buffer[i][j] = malloc (sizeof(char)*char_per_line*(height+1));

その後、

info->buffer[SOME_VALUE] =  output_buffer[SOME_WIDTH][SOME_HEIGHT];  

ここで混乱しているのは、output_buffer[2]がchar* [height + 1]型のポインターではないということですか?では、なぜmallocからメモリのアドレスを割り当てることができないのですか?

malloc一次元ポインタを返しますvoid*が、ご存知のように、output_buffer[2]は一次元ポインタではありません。タイプchar*[height+1]です。 []とは別に、もう1つのディメンションを追加し*ます。

于 2012-06-05T06:18:17.783 に答える
1

output_buffer[2] は char*[height+1] 型のポインタではありませんか?

No.output_buffer[2]は size の配列ですheight+1。その要素タイプはchar*.

では、メモリのアドレスを malloc から割り当てることができないのはなぜですか?

ご存じのとおり、配列に割り当てることはできません。

サイズが height+1 の配列。各スロットには、長さが char_per_line の cstring があります。

コードを希望どおりに動作させるにはどうすればよいですか?

(height+1)それぞれ sizeの C 文字列の配列が必要な場合は、 size のC 文字列char_per_lineを割り当てる必要があります。つまり、通話時間とそれぞれへのパスです。(1回の呼び出しでそれを行う方法がありますが、おそらく今はやりたくないでしょう)。(height+1)char_per_linemalloc (height+1)char_per_linemalloc

于 2012-06-05T06:41:11.880 に答える
0
typedef struct{
  ......
  char * buffer[height+1];    //height is a constant int
  ......} args

これはする必要があります

typedef struct{
  ......
  char ** buffer;    //height is a constant int
  ......} args

output_buffer[2] = malloc (sizeof(char)*char_per_line*(height+1));

forループでこれを行う必要があり、すべてのoutput_buffer [i] [j]に対して(現在はchar ** = char *です)。

于 2012-06-05T06:31:04.393 に答える