use*_*926 0 c pointers casting
#include<stdio.h>
int main(void)
{
int arr[3] = {2, 3, 4};
char *p;
p = (char*)arr;
printf("%d", *(int*)(p+1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在指针上做这个问题.我期望输出是一些垃圾值,因为从char*转换为int*但输出总是50331648,这很奇怪.请解释
编辑:我在某些网站上看到了这个输出问题,所以需要根据给定的指令输出
你正在做的是未定义的行为.
假设sizeof(int)是4
小端系统
在小端系统中,内存布局为arr:
arr
+----+----+----+----+----+----+----+----+----+----+----+----+
| 02 | 00 | 00 | 00 | 03 | 00 | 00 | 00 | 04 | 00 | 00 | 00 |
+----+----+----+----+----+----+----+----+----+----+----+----+
Run Code Online (Sandbox Code Playgroud)
当你使用:
char* p = arr;
p p+1
| |
v v
+----+----+----+----+----+----+----+----+----+----+----+----+
| 02 | 00 | 00 | 00 | 03 | 00 | 00 | 00 | 04 | 00 | 00 | 00 |
+----+----+----+----+----+----+----+----+----+----+----+----+
Run Code Online (Sandbox Code Playgroud)
如果您将其解释p+1为int*,并将该位置的对象评估为int,则得到:
+----+----+----+----+
| 00 | 00 | 00 | 03 |
+----+----+----+----+
Run Code Online (Sandbox Code Playgroud)
在一个小端系统中,这个数字是
0x03000000
Run Code Online (Sandbox Code Playgroud)
等于50331648,这是你得到的输出.
大端系统
在大端系统中,内存布局为arr:
arr
+----+----+----+----+----+----+----+----+----+----+----+----+
| 00 | 00 | 00 | 02 | 00 | 00 | 00 | 03 | 00 | 00 | 00 | 04 |
+----+----+----+----+----+----+----+----+----+----+----+----+
Run Code Online (Sandbox Code Playgroud)
评估时得到的数字*(int*)(p+1)是:
+----+----+----+----+
| 00 | 00 | 02 | 00 |
+----+----+----+----+
Run Code Online (Sandbox Code Playgroud)
这等于0x0200,即512.
很明显,为什么您正在执行的操作是未定义的行为.