【问题标题】:passing element of dynamic multidimensional array to a function将动态多维数组的元素传递给函数
【发布时间】:2013-01-25 13:26:35
【问题描述】:

我的代码已经可以运行,但正在尝试扩展它。

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

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

【问题讨论】:

  • 所有行的大小是否相等?如果是这样,请帮自己一个忙,为所有人分配一个大数组。

标签: c dynamic multidimensional-array


【解决方案1】:
LibFunction( info_ptr,(unsigned char **)data_ptr[index] + 1);

错了,因为data_ptrunsigned char **,所以data_ptr[index]unsigned char *。省略演员表并更正您正在调用的函数,它应该接受unsigned char *

【讨论】:

  • 可怕的转换是为了纠正编译错误。但是您关于更正功能的评论一针见血,让我看看真正的问题是什么。我无法更改函数(第三方库),但我确实设法在头文件中找到了另一个函数,该函数完成了相同的工作,但接受了一个间接级别较低的变量。谢谢!
【解决方案2】:

从前几行观察到您的程序中的一些更正

因为,

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

【讨论】:

  • 如何避免对 malloc 返回的指针进行类型转换?我现在的代码可以正常工作,但仍然需要依赖演员表。
  • 如果你使用 C 并且你的左值是正确的类型,你不需要进行类型转换。我们有由 malloc 返回的 void* 的隐式类型转换行为。
【解决方案3】:

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

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

【讨论】:

  • 我应该提到我正在编译为 C++。强制转换是为了响应编译错误。你说得对,我会读那个 Torvald 的文件。
【解决方案4】:

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

您的第一个分配应该是:

data_ptr = malloc(no_of_rows * sizeof *data_ptr);

【讨论】:

    【解决方案5】:

    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.
    

    【讨论】:

    • 如上面评论中所述,我正在处理第三方库,因此无法更改功能,至少在没有重新编译并向我的老板解释为什么我需要重新编译网络库的情况下!!
    【解决方案6】:

    你可以这样做:

    unsigned char* ptr = &data[0][1];
    LibFunction(info_ptr, &ptr);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      相关资源
      最近更新 更多