C语言 void*指向二维数组



我有一个结构体:

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

如此:

//CASE 2
pixel buf[16][16];
object.param = (void *)buf;
我的问题是:

  1. 在情况2为什么buf被解释为类型pixel的指针(当事实上buf存储pixel*),允许它被转换为void* ?
  2. 我如何使案例1工作?

应该可以正常工作:

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;
}

不需要强制转换,因为这是C语言,所以需要使用struct pixel而不是pixel

请记住,C中类型为foo[M][N]的2D数组实际上是包含M×N元素的1D数组,类型为foo*。如果您声明foo[10][3] a; foo *p = a;,那么foo[i][j]p[i*10+j]的含义完全相同。

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

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

最新更新