Как объявление и определение указателя работает для указателей? - PullRequest
0 голосов
/ 05 мая 2020

Для следующего кода sp inet:

#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 G CC v7.1.1: тайм-аут: отслеживаемая команда выгружает ядро ​​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;
}

1 Ответ

6 голосов
/ 05 мая 2020

Ни то, ни другое неверно.

В обоих случаях вы присваиваете целочисленное значение указателю. Затем это значение обрабатывается как допустимая ячейка памяти и разыменовывается. Но это недопустимая ячейка памяти, поэтому вы вызываете undefined поведение .

В первом случае UB проявляется как cra sh, а во втором случае проявляется как работающий правильно.

Что вам нужно сделать, так это присвоить адрес из x на a. Затем вы можете прочитать байты, которые составляют int.

char *a = (char *)&x;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...