这个C演员出了什么问题

pep*_*ein 3 c casting

我昨天在一个IRC频道遇到过这个,并且不明白为什么这是不好的行为:

#include <stdio.h>

int main(void)
{
     char x[sizeof(int)] = { '\0' }; int *y = (int *) x;
     printf("%d\n", *y);
}
Run Code Online (Sandbox Code Playgroud)

是否有任何数据丢失或任何损失?谁能给我任何文件来进一步解释它做错了什么?

Mat*_*lan 10

数组x可能无法在内存中正确对齐int.在x86上你不会注意到,但在其他架构上,例如SPARC,解除引用y会触发总线错误(SIGBUS)并导致程序崩溃.

任何地址都可能出现此问题:

int main(void)
{
    short a = 1;
    char b = 2;

    /* y not aligned */
    int* y = (int *)(&b);
    printf("%d\n", *y); /* SIGBUS */
}
Run Code Online (Sandbox Code Playgroud)

  • 你正在将char转换为指针,所以很明显它失败了.虽然他的数组与int的大小相同,但是它的转换为int. (2认同)

Mic*_*urr 7

首先,x不保证阵列正确对齐int.

有一个关于这可能会影响放置等技术的对话话题new.应该注意的是,在正确对齐的内存中也需要放置新的内容,但是新的贴片通常与动态分配的内存一起使用,并且需要分配函数(在C和C++中)以返回适合任何类型的内存所以地址可以分配给任何类型的指针.

对于自动变量的编译器分配的内存,情况也是如此.

  • 我不认为这是有效的C++.涉及的类型不满足3.10/15.特别是,代码的行为取决于`int`的对齐和`int`的值表示.在C++中,这更是一个问题,因为C++声明未指定的行为会将非确定性引入其抽象机器,并且如果*任何*这样的可能执行路径产生未定义的行为,那么它对执行实现没有要求.这意味着,上面的代码实际上是在执行未定义的行为,因为未指定值和对象表示. (2认同)