繁体   English   中英

void *指向2D数组

[英]void* pointing to 2D array

我有一个结构:

struct foo
{
  void *param;
};

void main(){
  foo object;
}

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

我知道这显然不行的:

//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

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

出于同样的原因,如果您使用object.param = (void *)bufobject.param = buf用作第一种情况。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM