将动态多维数组的元素传递给函数

时间:2013-01-25 13:26:36

标签: c dynamic multidimensional-array

我的代码已经有效但我正在尝试扩展它。

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数组的单个元素的地址,在网上找不到任何其他内容。

6 个答案:

答案 0 :(得分:1)

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

错误,因为data_ptrunsigned 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.