我有一个结构:
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
我的问题是:
//CASE 2
pixel buf[16][16];
object.param = (void *)buf;
被解释为类型为buf
的指针(事实上pixel
存储buf
),这允许将其强制转换为{{ 1}? 答案 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 *)buf
或object.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]
的意思完全相同。