首页 > 解决方案 > 是否将其值溢出单个字符的 int 地址转换为指向 char UB 的指针?

问题描述

你好我有这个例子:

int main(){

    int x = 300;
    char* p = (char*)&x;
    printf("%s\n", p);
    printf("%d\n", *p);

}

输出:

,
44

你怎么看和推荐?

标签: c++casting

解决方案


这里没有UB。通常,这样做会违反严格的别名(导致 UB),但有一个例外允许您使用char指针来访问任何类型。

300在内存中表示为 4 个字节:(44 1 0 0假设sizeof(int) == 4,这是很常见的,并假设是小端序)。

printf("%s\n", p);将这 4 个字节解释为 C 字符串。您将通过打印得到相同的结果

const char str[4] = {44, 1, 0, 0}; // Same as `{',', '\1', '\0', '\0'}`

300理论上,如果 的字节表示不包含空字节,您可以获得 UB ,因为它会导致printf继续读取内存超出 的范围x,寻找空终止符。但是没有真正的平台可以做到这一点,所以它应该是安全的。

*p访问 的表示形式中的第一个字节x,即44.


如果您要在大端平台上尝试此代码,您将0分别得到一个空字符串和 a,因为 的字节表示3000 0 1 44.


x有一个溢出的正值signed char

这不是问题。


推荐阅读