我有一个结构体:
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;
我的问题是:- 在情况2为什么
buf
被解释为类型pixel
的指针(当事实上buf
存储pixel*
),允许它被转换为void*
? - 我如何使案例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 *)buf
或object.param = buf
,则第一种情况将起作用,如@Iskar所述。