为什么将 Short* 转换为 int* 显示不正确的值

Raf*_*tel 3 c pointers

为了更好地了解malloc指针如何在内部工作,我创建了一个short. 在我的系统上,int是 的大小的两倍,因此我创建了另一个类型的short指针并将其地址设置为 的转换值:qint*p

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main() {
    short* p = (short*) malloc(2 * sizeof(short));
    int* q = (int*) p;
    
    assert(sizeof *q == 2 * sizeof *p);
    
    p[0] = 0;
    p[1] = 1;
    
    printf("%u\n", *q);
}
Run Code Online (Sandbox Code Playgroud)

当我打印时,它显示的是*q数字,而不是我不明白为什么。如果我理解正确的话,应该表示如下(假设short是2个字节,int是4个字节):655361p

        p[0]                  p[1]
0000 0000 0000 0000 | 0000 0000 0000 0001
Run Code Online (Sandbox Code Playgroud)

因此*q应该读取 4 个字节,从而读取值1。相反,它显示了65536表示为:

0000 0000 0000 0001 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 8

如今,您可能与之交互的大多数系统都使用小尾数字节排序,这意味着最低有效字节在前。

因此,从 0x01 0x00 开始的字节p[1]包含 0x01 0x00,而不是 0x00 0x01。p[0]这也意味着从0x00 0x00 0x10 0x00开始的字节。如果这些字节随后被解释为 4 字节,int则其值为 0x00010000,即十进制 65536。

此外,以这种方式重新解释字节(即采用指向一种类型的指针,将其转换为另一种指针类型,然后取消引用)是一种别名冲突并会触发未定义的行为,因此不能保证始终以这种方式工作。