int指针进入void指针然后进入双指针

T.J*_*.J. 2 c void-pointers

#include <stdio.h>
#include <string.h>

main()
{
    int an_int;
void *void_pointer = &an_int;
double *double_ptr = void_pointer;
*double_ptr = 10;

printf("%d", sizeof(*double_ptr));

}
Run Code Online (Sandbox Code Playgroud)

这个程序的输出是8.这是
怎么回事?
我的意思是double_ptr指向4字节内存,但仍然输出为8.
*其他4个字节来自哪里?该程序应该崩溃,因为没有分配其他4个字节.*
请解释一下?

Jen*_*edt 6

C是静态类型的,表达式sizeof *double_ptr仅根据这些静态类型规则计算,即double_ptr指向double具有大小的a 8.

此程序具有未定义的行为,因为您正在写入您不"拥有"的内存范围.所有赌注都已关闭,可能会崩溃或不崩溃.在进行这种讨厌的转换时,你应该对此负责,而不是编译器.

编辑,为挑剔:

  • 一致的编译器不应容忍没有返回类型的函数.提高警告水平.
  • 在此处发布代码时,请正确缩进
  • 该结果sizeof算不算int而是size_t一个无符号的类型.打印时"%d"也有未定义的行为.使用"%zu".