Что происходит, когда указатель типа int приводится к типу char? Есть еще один вопрос, помеченный здесь как дублированный, я попытаюсь объяснить его.
$ cat a.c
#include <stdio.h>
int main(){
int a;
char *x;
x = (char *) &a;
a=512;
x[0]=1;
x[1]=2;
printf("%d\n",a);
return 0;
}
Скомпилируйте и запустите:
$ gcc a.c && ./a.out
513
Почему это 513?Мы можем использовать gdb, чтобы увидеть основную причину.
$ gcc a.c -g && gdb ./a.out
(gdb) list
1 #include <stdio.h>
2
3 int main(){
4 int a;
5 char *x;
6 x = (char *) &a;
7 a=512;
8 x[0]=1;
9 x[1]=2;
10 printf("%d\n",a);
установить точку останова в строке 8 переменного тока и запустить
(gdb) b a.c:8
Breakpoint 1 at 0x40113d: file a.c, line 8.
(gdb) run
после остановки программы в точке останова, вывести переменную aадрес памяти.
(gdb) p &a
$2 = (int *) 0x7fffffffd9d4
(gdb) p x
$3 = 0x7fffffffd9d4 ""
адрес памяти переменной a равен 0x7fffffffd9d4, а значение переменной x такое же.
перед тем, как показать содержимое памяти, давайте разберемся, как 512 в шестнадцатеричном формате это:
00 00 02 00
, а x86 имеет младший порядок байтов, поэтому в памяти должно быть:
[higher address] 00 02 00 00 [lower address]
Давайте покажем реальную память, такую же, как мы думали.
(gdb) x/4xb 0x7fffffffd9d4
0x7fffffffd9d4: 0x00 0x02 0x00 0x00
затем, покажите адрес памяти x [0] и x [1] и преобразуйте содержимое памяти в реальное значение, не должно быть трудно понять, почему распечатывается 513.
(gdb) p &x[0]
$4 = 0x7fffffffd9d4 ""
(gdb) p &x[1]
$5 = 0x7fffffffd9d5 "\002"