0

すでに機能しているコードがありますが、それを拡張しようとしています。

unsigned char **data_ptr;

最初の「配列」にメモリを割り当てます

data_ptr = (unsigned char **)malloc(sizeof(unsigned char **) * no_of_rows);

次に、ループで各行を初期化します

data_ptr[index] = (unsigned char *)malloc(sizeof(unsigned char*), rowsize));

次に、配列のアドレスをライブラリ関数に渡します。行の先頭を渡すだけで問題なく動作します...

LibFunction( info_ptr,  &data_ptr[index] )  //OK

しかし、関数がデータの書き込みを開始する行のアドレスを渡す必要があります。これらは両方ともコンパイルされますが、操作に失敗します

LibFunction( info_ptr,(unsigned char **)data_ptr[index] + 1); 

また..

LibFunction( info_ptr,(unsigned char **)data_ptr[index][1]);

LibFunction は次の形式です

LibFunction(..., unsigned char **)

行サイズで必要以上のメモリを割り当てているので、配列をオーバーランしているとは思いません。前述したように、行の先頭を渡すとコードは正常に動作しますが、他の要素を渡そうとするとバグが発生します。他に何か問題があるかもしれませんが、構文が正しいかどうかをまず知る必要があります。

動的 2 次元配列の単一要素のアドレスを渡すことに関して、ネット上で他に何も見つかりません。

4

6 に答える 6

1

上数行から見た、プログラム内のいくつかの修正

以来、

unsigned char **data_ptr; // a pointer to a char pointer

sizeof(char*) を取得し、常に malloc() によって返されるポインターの型キャストを回避します

data_ptr = malloc(sizeof(unsigned char *) * no_of_rows);

そして、行の割り当てを行うために、

data_ptr[index] = (unsigned char *)malloc(sizeof(unsigned char*)* rowsize));

関数がデータの書き込みを開始する行のアドレスを渡すには、関数のシグネチャを次のように変更します。

LibFunction(..., unsigned char *)
于 2013-01-25T13:44:37.317 に答える
1
LibFunction( info_ptr,(unsigned char **)data_ptr[index] + 1);

は ですのでdata_ptr、間違っています。キャストを省略して、呼び出している関数を修正します。unsigned char **data_ptr[index]unsigned char *unsigned char *

于 2013-01-25T13:43:18.957 に答える
0

But I need to pass the address of where in a row I want the function to begin writing data

簡単に始めましょう。配列を正しいサイズにするためにsizeof、複雑な型を取得しようとするのを忘れて、これを簡単に行うことができます。

unsigned char **data_ptr;
data_ptr = malloc(sizeof(data_ptr) * no_of_rows); //Just sizeof your var

これで、正しいメモリmallocができました。次に、残りのメモリを簡単にmallocできます。

for(index = 0; index < no_of_rows; index++)
  data_ptr[index] = malloc(sizeof(unsigned char*) * rowsize);

最後に、すべての設定が完了したので、配列を初期化する必要があります。

for(index = 0; index < no_of_rows; index++)
  for(index2 = 0; index2 < rowsize; index2++)
     data_ptr[index][index2] = 0;

関数に関しては、配列の「部分」を取得する必要があるため、配列とサイズ(初期化する配列の長さ)を取得する必要があります。

void LibFunction(unsigned char data[], int size);

これで、次のように簡単にデータを保存する準備が整いました。

LibFunction(&data_ptr[1][2], 3);  // store data in second row, 3rd column, store
                                  // three values.
于 2013-01-25T13:54:49.347 に答える
0

それはLibFunction(&data_ptr[row][start_here])、あたかも単なるunsigned char[ROWS][COLUMNS];.

一般に、私の経験では、現代の C でキャストが必要だと思う場合は、何をしようとしているのか混乱している可能性があります。/ に関する Linus Torvalds の投稿へのコメントをお読みください。この種のものについて。

于 2013-01-25T13:45:14.780 に答える
0

次のようなことができます。

unsigned char* ptr = &data[0][1];
LibFunction(info_ptr, &ptr);
于 2013-01-25T13:32:49.390 に答える
0

no_of_rowsポインターへのポインター用のスペースを割り当てていません。アスタリスクが多すぎます。また、[C では , の戻り値をキャストしないでくださいmalloc()][1]。

最初の割り当ては次のとおりです。

data_ptr = malloc(no_of_rows * sizeof *data_ptr);
于 2013-01-25T13:47:13.560 に答える