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 **)

我分配的内存比我需要的多,所以我不认为我超出了数组。正如我所说,如果我将它传递给一行的开头,则代码可以正常工作,但如果我尝试传递任何其他元素,则会出错。可能还有其他问题,但我需要先知道我的语法是否正常。

关于传递动态二维数组的单个元素的地址,在网上找不到其他任何东西。

4

6 回答 6

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 回答
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 回答
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,接下来您可以轻松地为其余的内存分配内存:

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

你可以这样做:

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

您没有为no_of_rows指向指针的指针分配空间;里面的星号太多了。malloc()另外,你真的[不应该在 C][1]中转换 , 的返回值。

您的第一个分配应该是:

data_ptr = malloc(no_of_rows * sizeof *data_ptr);
于 2013-01-25T13:47:13.560 回答
0

它应该是LibFunction(&data_ptr[row][start_here]),就像它只是一个unsigned char[ROWS][COLUMNS];.

一般来说,根据我的经验,如果你认为你需要在现代 C 中进行强制转换,那么你很可能对你正在尝试做的事情感到困惑。一个不错的阅读是对 Linus Torvalds 在 / 上的帖子的评论。在这种东西上。

于 2013-01-25T13:45:14.780 回答