指针的声明和定义是如何进行的?

问题描述 投票:1回答:1

对于下面的代码spinet:

#include <stdio.h>

int main(void) {
    int x = 12345678;
    char *a = x;

    printf("%d\n", x);

    printf("%d\n %d\n %d\n %d\n", a[0], a[1], a[2], a[3]);

    return 0;
}

GNU GCC v7.1.1的输出:超时:被监控的命令转储 core sh:第1行:11792分段故障超时 10s main

请注意以下工作。

#include <stdio.h>

int main(void) {
    int x = 12345678;
    char *a;
    *a = x;

    printf("%d\n", x);

    printf("%d\n %d\n %d\n %d\n", a[0], a[1], a[2], a[3]);
    return 0;
}
c pointers
1个回答
6
投票

这两种情况都不正确。

在这两种情况下,你都是将一个整数值赋给一个指针。 这个值会被视为一个有效的内存位置并被取消引用。 但它并不是一个有效的内存位置,所以我们调用了 未定义行为.

在第一种情况下,UB表现为崩溃,在第二种情况下,它表现为看起来可以正常工作。

你需要做的是将 地址xa. 然后,你可以读取组成 int.

char *a = (char *)&x;
© www.soinside.com 2019 - 2024. All rights reserved.