在这段代码中,为什么是sizeof(x)指针的大小,而不是类型的大小x?
typedef struct {
...
} x;
void foo() {
x *x = malloc(sizeof(x));
}
Run Code Online (Sandbox Code Playgroud)
因为C说:
(C99,6.2.1p7)"任何其他标识符的范围都在其声明者完成之后开始."
因此,在您的示例中,对象的范围x始于x *x:
x *x = /* scope of object x starts here */
malloc(sizeof(x));
Run Code Online (Sandbox Code Playgroud)
为了说服自己,x在声明对象后立即输入另一个类型的对象声明x:您将收到编译错误:
void foo(void)
{
x *x = malloc(sizeof(x)); // OK
x *a; // Error, x is now the name of an object
}
Run Code Online (Sandbox Code Playgroud)
否则,正如Shahbaz在另一个答案的评论中所说,这仍然不是正确的用法malloc.你应该这样打电话malloc:
T *a = malloc(sizeof *a);
Run Code Online (Sandbox Code Playgroud)
并不是
T *a = malloc(sizeof a);
Run Code Online (Sandbox Code Playgroud)
这是因为sizeof(x)使用最里面的定义x,即指针.要避免此问题,请不要对类型和变量使用相同的名称.