>我有已经工作的代码,但正在尝试扩展它。
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 **)
我分配的内存比行大小需要的要多,所以我认为我不会溢出数组。正如我所说,如果我在一行的开头传递它,代码工作正常,但如果尝试传递任何其他元素。可能还有其他问题,但我需要首先知道我的语法是否正常。
在网上找不到关于传递动态 2d 数组单个元素地址的任何其他内容。
LibFunction( info_ptr,(unsigned char **)data_ptr[index] + 1);
错了data_ptr
是unsigned char **
,所以data_ptr[index]
是unsigned char *
。省略强制转换并更正您正在调用的函数,它应该接受unsigned char *
。
程序中的一些更正,从前几行观察到
因为
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 *)
它应该是LibFunction(&data_ptr[row][start_here])
的,就像它只是一个unsigned char[ROWS][COLUMNS];
完全相同。
总的来说,根据我的经验,如果你认为你需要现代 C 的演员阵容,那么你很可能对你想要做的事情感到困惑。一个不错的阅读是对Linus Torvalds在/上的帖子的评论。在这种东西上。
您没有为指向指针no_of_rows
指针分配空间;那里的星号太多了。另外,你真的[不应该在C中转换malloc()
的返回值][1]。
您的第一个分配应该是:
data_ptr = malloc(no_of_rows * sizeof *data_ptr);
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.
你可以做这样的事情:
unsigned char* ptr = &data[0][1];
LibFunction(info_ptr, &ptr);