c char到int指针

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,这很奇怪.请解释

编辑:我在某些网站上看到了这个输出问题,所以需要根据给定的指令输出

R S*_*ahu 7

你正在做的是未定义的行为.

假设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+1int*,并将该位置的对象评估为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.

很明显,为什么您正在执行的操作是未定义的行为.