我的代码已经有效但我正在尝试扩展它。
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 **)
我正在使用rowsize分配比我需要的内存更多的内存,所以我不认为我超出了数组。正如我所说的,如果我把它传递给行的开头但是如果我发出错误,代码就可以正常工作 尝试传递任何其他元素。可能还有其他问题,但我需要先知道我的语法是否合适。
关于传递动态2d数组的单个元素的地址,在网上找不到任何其他内容。
答案 0 :(得分:1)
LibFunction( info_ptr,(unsigned char **)data_ptr[index] + 1);
错误,因为data_ptr
是unsigned char **
,因此data_ptr[index]
是unsigned char *
。抛弃演员阵容并更正你正在调用的函数,它应该接受unsigned char *
。
答案 1 :(得分: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 *)
答案 2 :(得分:0)
您可以这样做:
unsigned char* ptr = &data[0][1];
LibFunction(info_ptr, &ptr);
答案 3 :(得分:0)
它应该是LibFunction(&data_ptr[row][start_here])
,与它只是unsigned char[ROWS][COLUMNS];
完全相同。
一般来说,根据我的经验,如果你认为在现代C中你需要演员阵容,你可能会对你想要做的事情感到困惑。一个很好的读物是Linus Torvalds在/的帖子上comment。关于这种事情。
答案 4 :(得分:0)
你没有为no_of_rows
指针分配空间;那里有一个星号太多了。另外,你真的[不应该在C] [1]中投射malloc()
的返回值。
您的第一次分配应该是:
data_ptr = malloc(no_of_rows * sizeof *data_ptr);
答案 5 :(得分: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.