gpt4 book ai didi

c - 为什么输出是 2,0 而不是 2,3?

转载 作者:太空宇宙 更新时间:2023-11-04 05:35:04 26 4
gpt4 key购买 nike

 #include<stdio.h>

int main()
{
int arr[3] = {2, 3, 4};
char *p;
p = arr;
p = (char*)((int*)(p));
printf("%d, ", *p);
p = (int*)(p+1);
printf("%d", *p);
return 0;
}

不是 p = (int*)(p+1) ;指向数组的下一个元素? (即 3?)所以输出应该是 2,3。但是输出是2,0。为什么?

最佳答案

您正在将 char 指针 p 增加到下一个 char 内存位置 - 即 0 数字 2 的填充字节,它是一个 int 占用 4 个内存位置(其他 3 个用零填充)。

简而言之,只需将 char *p; 替换为 int *p; 并去掉 p = (char*)(( int*)(p)); - 你的程序应该可以正常工作。(为了使其保持无用的转换,将 p = (int*)(p+1); 更改为 p = (char *) (((int *) p) + 1); 这样增量发生在整数指针上,而不是字符指针上)

在小端内存模型中,例如当前 PC 中使用的,每个 int 数字在内存中占用 4 个字节 - 第一个是最不重要的(因此,对于小于 256 (2 ^ 8) 的数字,它们包含整数)。

你在内存中有这个字节序列:'02 00 00 00 03 00 00 00 04 00 00 00'

当您使用“char *”指针时,编译器知道 char 数据元素的大小是 1 个字节。在增加它时,它只会继续到相邻字节,即“0”。

在“printf”调用中,您访问“char * p”处的内容,这是一个单字节数字 - 0,编译器在对“printf”的调用中填充该值,以便函数仍然看到“0” - 但在其他编译器和系统中,它可能会打印垃圾或段错误,因为 printf 的“%d”参数预期的 3 个字节不会在那里。

关于c - 为什么输出是 2,0 而不是 2,3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41427910/

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