int main()
{
int N = 2;
int M = 3;
int *x[N];
x=(int(*)[N])malloc(M*sizeof(*x));
printf("%ld %ld",sizeof(x),sizeof(*x));
}
我想了解这句话
x=(int(*)[N])malloc(M*sizeof(*x));
上述程序的输出
数组 (
x
) 几乎总是等价于指向其第一个元素 (&( x[0] )
) 的指针。
因此这些是等价的:
malloc( M * sizeof( *x ) )
malloc( M * sizeof( *&x[ 0 ] ) )
malloc( M * sizeof( x[ 0 ] ) )
由于
x
是指向 int
对象的指针数组,因此 x[ 0 ]
是 int
对象的指针,这将分配一个指向 M
对象的 int
指针数组。
这是第一个错误。应为
N
指针分配空间。
类型为
int(*)[ N ]
的对象是指向 N 个 int
对象数组的指针。
这是错误#2。您分配了一个指向
int
对象的指针数组,而不是 int
对象的数组。
最后,您尝试分配给一个数组。
这是错误 #3。分配给数组是非法的,并且会导致编译时错误。
<source>: In function 'main':
<source>:9:6: error: assignment to expression with array type
9 | x=(int(*)[N])malloc(M*sizeof(*x));
| ^