我最近看到的一个代码示例如下:

#include <stdio.h>
#include <stdlib.h>

struct x {
       int a;
       int b;
};

int main(void) {

    struct x *ptr = malloc(sizeof(*ptr));
    return 0;
}
  • sizeof(*ptr)是怎么工作的呢?

  • 如何取消引用未定义的指针并将其赋值为sizeof()并产生正确的大小?(当然,这应该会导致未定义的行为,因为它是未定义的)

  • 最后,C标准是否定义了这种行为?(也许在C中显示它是合法的,我找不到任何东西)

推荐答案

这里实际上并没有取消引用ptr.仅查看sizeof运算符的操作数(在本例中为表达式*ptr)的类型.

这在第C standard节关于sizeof操作员的第6.5.3.4p2节中有详细说明:

sizeof运算符产生其操作数的大小(以字节为单位), 可以是类型的表达式或带括号的名称.大小是 由操作数的类型确定.结果是一个整数.如果 操作数的类型是可变长度数组类型,即操作数 已判断;otherwise, the operand is not evaluated and the result is an integer constant

在此特定情况下,*ptr不求值,但它的类型为struct x,因此sizeof(*ptr)求值为一个常量,即struct x的字节大小.

C++相关问答推荐

由于未签名int导致的运行时错误"

为什么已经设置的值在C中被重置为for循环条件中的新值?

不同到达时间的轮询实现

返回一个包含数组的 struct

显式地将值转换为它从函数返回的类型的含义是什么?

将 struct 变量赋给自身(通过指针取消引用)是否定义了行为?

#If指令中未定义宏?

C++中矢量类型定义和数据保护的高效解决方案

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

获取每个循环迭代结束时的当前时间

通过描述符查找文件路径时出现问题

按长度对argv中的单词进行排序

无法识别C编程语言的语法,如书中所示

为什么我的二叉树删除删除整个左部分的树?

如何使用空元素块声明指针数组

具有正确标头的C struct 定义问题

当我在34mb的.mp4文件中使用FREAD时,我得到了一个分段错误,我如何解决它?

try 判断长整数是否为素数

浮点正零何时不全为零?

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?