void *指向2D数组

时间:2015-09-16 23:11:27

标签: c arrays pointers

我有一个结构:

self

我需要让object.param指向动态分配的2D数组。

我知道这显然工作:

struct foo
{
  void *param;
};

void main(){
  foo object;
}

这有效:

//CASE 1
pixel **buf = (pixel**)malloc(16*sizeof(pixel*));
for(int i=0; i<16;i++)
   buf[i] = (pixel*)malloc(16*sizeof(pixel));

object.param = (void **)buf

我的问题是:

  1. 在案例2中,为什么//CASE 2 pixel buf[16][16]; object.param = (void *)buf; 被解释为类型为buf的指针(事实上pixel存储buf),这允许将其强制转换为{{ 1}?
  2. 如何让案例1有效?

3 个答案:

答案 0 :(得分:1)

这应该可以正常工作:

array1

演员阵容不是必需的,因为这是C,你需要使用int main(){ struct foo object; struct pixel **buf = malloc(10*sizeof(struct pixel*)); for(int i=0; i<10;i++) buf[i] = malloc(10*sizeof(struct pixel)); object.param = buf; } 代替struct pixel

答案 1 :(得分:0)

第二种情况有效,因为您可以将任何指针转换为void*

出于同样的原因,如果您执行object.param = (void *)bufobject.param = buf作为@Iskar评论,则第一种情况将起作用。

答案 2 :(得分:0)

请记住,类型为foo[M][N]的C中的二维数组实际上是一个M×N元素的一维数组,其类型为foo*。如果您声明foo[10][3] a; foo *p = a;,那么foo[i][j]p[i*10+j]的意思完全相同。