下面程序的输出是什么,有原因吗

问题描述 投票:0回答:1
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));

上述程序的输出

c
1个回答
0
投票

数组 (

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));
      |      ^
© www.soinside.com 2019 - 2024. All rights reserved.