无法理解输出

标签 c pointers

代码如下所示。

#include<stdio.h>

int main(){
    int vals[2];
    char *x;
    int *v, *v2, *v3;
    vals[0] = 0x00ABCDEF;
    vals[1] = 0x12345678;

    x = (char *) &vals[0];
    v = (int *) (x + 1);
    v2 = (int *) (x+2);
    v3 = (int *) (x+3);

    printf ("%x \n", *x); /*0x EF */
    printf ("%x \n", *v); /*0x 7800ABCD */
    printf ("%x \n", *v2); /*0x 567800AB */
    printf ("%x \n", *v3); /*0x 34567800 */
}

注释中的值是输出。 你能解释一下 x 如何指向 EF 以及 v 、 v2 、 v3 吗? 对此有何解释。我知道一个十六进制数字是四位,一个 int 可以存储 8 个十六进制数字,但无法理解 x 如何指向 EF 而不是 00,这是前两个字母,以及为什么最后两个字母而不是前两个字母。

最佳答案

如果您的系统有对齐要求,则 v = (int *) (x + 1);(以及接下来的两行)会由于对齐违规而导致未定义的行为。

但即使他们不这样做,*v 稍后也会通过违反严格的别名规则而导致未定义的行为。表达式 *v 的类型为 int ,不允许使用这种类型的表达式访问 char 对象(或实际上任何对象intunsigned int 或它们的 const 限定版本除外)。

Undefined behaviour意味着任何事情都可能发生,包括无意义的输出或其他。

关于无法理解输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40435517/

相关文章:

linux-kernel - 无法打印从用户空间 C 应用程序发送到 linux 内核模块的消息

c - FFMpeg示例程序

c - int_least16_t 是否有可能成为 int 而不是 short 的别名?

c++ - 确定指针在文本文件中的位置

c - 如何在 MPI 中发送结构指针

c - strtok 和转义字符

编译器警告..C语言(类型问题..)

c++:在原始指针映射中复制、删除和运算符=

c++ - 如何删除堆中未存储到变量指针的对象?

比较一个整数和一个变量的地址