gpt4 book ai didi

c - 当我们将 char * 转换为 int * 时,后台或内存中会发生什么

转载 作者:太空狗 更新时间:2023-10-29 16:00:12 27 4
gpt4 key购买 nike

我正在学习指针的类型转换,随机来到这个程序

#include <stdio.h>
main() {
char* p="01234567890123456789";
int *pp = (int *)p;
printf("%d",pp[0]);
}

执行上述程序时,输出为 858927408这些随机数是什么?它们来自哪里?后台或内存中发生了什么?

编辑:如果我写 printf("%c",pp[0]); 那么输出是 0 这是正确的但是当我改变 pp[0]pp[1] 然后输出是 4 但如何呢?

最佳答案

如果你用十六进制(%x)表示结果,你可以看到:

858927408 = 0x33323130
  • 0x33'3'
  • 的 ascii 码
  • 0x32'2'
  • 的ascii码
  • 0x31'1'
  • 的ascii码
  • 0x30'0'
  • 的 ascii 码

所以您只显示存储 0123456... 的内存,但是由于您的处理器是 little endian ,所以您会看到反转的代码。

在内存中,你有(六边形)

30 31 32 33 34 35 36 37 38   # 0 1 2 3 4 5 6 7 8
39 30 31 32 33 34 35 36 37 # 9 0 1 2 3 4 5 6 7
38 39 00 # 8 9\0

printf("%d...") 中,您读取前 4 个字节作为小端整数,因此它显示 0x33*0x1000000 + 0x32* 的结果0x10000 +0x31*0x100 +0x30


有了 %c,事情就不同了:

如果您编写 printf("%c", pp[0]),您将尝试从 0x33323130 打印一个字符,所以 0x30 被保留(在你的情况下,在某些情况下可能是一个 UB,我不确定)所以它显示“0”,它的 ascii 代码是 0x30

如果您编写 printf("%c", pp[1]),您将尝试从 0x37363534 打印一个字符,因此 0x34 被保留,所以它显示“4”,其 ascii 码是 0x34

关于c - 当我们将 char * 转换为 int * 时,后台或内存中会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56933316/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com