gpt4 book ai didi

C 教程 - 想知道 `int i = *(int *)&s;`

转载 作者:太空狗 更新时间:2023-10-29 14:53:34 26 4
gpt4 key购买 nike

按照我的方式完成 C 教程

#include <stdio.h>

int main() {
short s = 10;
int i = *(int *)&s; // wonder about this
printf("%i", i);
return 0;
}

当我告诉Cs的地址是一个int时,它不应该读取4个字节吗?

s 的最左边 2 个字节开始。在哪种情况下,这不是非常危险,因为我不知道它在读什么,因为 short 只分配了 2 个字节?

这不应该因为试图访问我没有分配/属于我的内存而崩溃吗?

最佳答案

  1. 永远不要那样做
  2. 如果教程教导/鼓吹这些内容,请将其丢弃。

正如您所指出的,它将读取比实际分配的字节更多的字节,因此它会从您的变量未分配的内存中读取一些垃圾值。

事实上它很危险,它破坏了 Strict Aliasing Rule [详情如下] 并导致未定义的行为
编译器应该给你这样的警告。

warning: dereferencing type-punned pointer will break strict-aliasing rules

当编译器发出警告时,您应该始终听取它的意见。


[详情]

严格别名 是 C(或 C++)编译器做出的假设,即取消引用指向不同类型对象的指针永远不会引用相同的内存位置(即相互别名。)

规则的异常(exception)是 char*,它可以指向任何类型。

关于C 教程 - 想知道 `int i = *(int *)&s;`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7462836/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com