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



>我有已经工作的代码,但正在尝试扩展它。

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_ptrunsigned 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);

相关内容

  • 没有找到相关文章

最新更新