为什么sizeof(type)是指针的大小,而不是类型本身的大小?

the*_*ejh 3 c sizeof

在这段代码中,为什么是sizeof(x)指针的大小,而不是类型的大小x

typedef struct {
  ...
} x;

void foo() {
  x *x = malloc(sizeof(x));
}
Run Code Online (Sandbox Code Playgroud)

oua*_*uah 6

因为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)


the*_*ejh 5

这是因为sizeof(x)使用最里面的定义x,即指针.要避免此问题,请不要对类型和变量使用相同的名称.

  • 另外,使用malloc,使用如下:`type*var = malloc(sizeof(*var));`而不是`malloc(sizeof(type))` (5认同)