【问题标题】:Casting void* to two-dimentional array将 void* 转换为二维数组
【发布时间】:2011-11-27 19:43:39
【问题描述】:

我有一个 void* 我得到了一些函数,它实际上是一个二维 int 数组。 我想将它作为参数发送给需要二维数组的函数。 正确投射的最佳方法是什么?

void foo(void* val){
   //How to cast val in order to send to bar??
   bar()
}

void bar(int val[2][2]){
//Do something 
}

【问题讨论】:

  • void * 不会在 C 中自动翻译自己吗?
  • 我无法更改 bar 的签名!
  • @CarlNorum - 仅调用 bar(val) 不会编译
  • @Zahy:你试过了吗?它适用于我的编译器(GCC 4.6.1,C99 标准),即使打开所有警告也不会发出警告。根据标准,我相信它应该在任何 C 编译器中工作(尽管不在 C++ 编译器中)。
  • 是的。我的错误确实有效(!) - 反应太快了。

标签: c casting multidimensional-array


【解决方案1】:
bar((int(*)[2]) val);

(正如 Carl Norum 所说,演员阵容实际上并不是必需的;但如果您不小心将它传递给期望 int(*)[3] 的函数,它的优点是会给您一个编译器警告。)

【讨论】:

  • +1。它的缺点是看起来很吓人,但实际上并不可怕。我猜是程序员的判断,但如果可能的话,我会尽量避免写一些看起来很疯狂的东西。
  • @CarlNorum:我知道你的意思。就个人而言,我尽量避免让多维数组以void * 结尾,因为往返特别容易出错。使用多维数组的一种替代方法是将int[2] 包装成struct。另一种是使用锯齿状数组,但显然这意味着必须处理内存分配。
  • @CarlNorum 和 ruakh,谢谢。那么数组转换是可能的,但是为什么这不起作用:? int int2Arr[2][2] = (int(*)[2])theVoidPtr;
  • @Zahy:与int arr1[2][2]; int arr2[2][2] = arr1; 不起作用的原因相同。当数组是函数的参数时,它本质上只是设置为指向传入的任何内容的指针;但是当你在函数中将数组声明为局部变量时,它的空间是在堆栈上分配的,所以这不仅仅是重新解释现有指针的问题。
  • @Zahy: 如果p 是一个void *,你知道它指向一个int[...][2],你可以写int (*arr)[2] = p; 来声明一个具有相同基础数据的arr,但是类型为int[...][2]。然后您可以参考arr[0][0]arr[0][1]arr[1][0]arr[1][1],正如您所期望的那样。您不能将其转换为int**,因为在C 中,多维数组不是指针数组。在内部,它基本上存储为一维数组,编译器会完成所有工作以将arr[i][j] 视为((int *)p)[2*i+j]2 是每行的元素数)。
猜你喜欢
  • 2013-08-28
  • 2019-01-23
  • 2020-03-26
  • 2012-08-15
  • 2021-01-31
  • 2016-02-18
  • 2018-02-19
相关资源
最近更新 更多