我正在学习C编程语言,我刚刚开始学习arrays with pointers.我在这个问题上有问题,我希望输出必须是100,但它是101,谁能解释为什么?

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

推荐答案

假设一个小端 struct ,其中int是32位(4字节),则int arr[]的单个字节如下所示(低位地址的最低有效字节.祸不单行中的所有值):

|01 00 00 00|02 00 00 00|03 00 00 00|04 00 00 00|05 00 00 00
char *ptr = (char *) arr;

现在,ptr点指向第一个字节——由于您已将其转换为char*,因此它将被视为字符数组:

|1|0|0|0|2|0|0|0|3|0|0|0|4|0|0|0|5|0|0|0
 ^
 +-- ptr

然后,*(ptr+4)访问char数组的第五个元素并返回相应的char值:

|1|0|0|0|2|0|0|0|3|0|0|0|4|0|0|0|5|0|0|0
         ^
         +-- *(ptr + 4) = 2

因此,printf()个 fingerprint 2个.

Big Endian系统上,每个int中的字节顺序颠倒,导致

|0|0|0|1|0|0|0|2|0|0|0|3|0|0|0|4|0|0|0|5
         ^
         +-- *(ptr + 4) = 0

C++相关问答推荐

为什么macOS上的FIFA管道比匿名管道慢8倍?

segfault在C中使用getline()函数

为什么getchar()挂起了,尽管poll()返回了一个好的值?""

在C语言中使用scanf()时我无法理解的警告

有没有更简单的方法从用户那里获取数据类型来计算结果

为什么GCC在每次循环迭代时都会生成一个数组的mov&S使用[]访问数组?(-03,x86)

从纯C中访问通用项对话框

C由四个8位整数组成无符号32位整数

将uintptr_t添加到指针是否对称?

Setenv在c编程中的用法?

实现简单字典时C语言中的段错误

Boyer Moore算法的简单版本中的未定义行为

无法访问共享目标文件内的共享指针

C将数组传递给函数以修改数组

CS50判断灯泡运动的问题,判断时多出一个灯泡,但不在终端上

对于STM32微控制器,全局偏移表.get和.Got.plt必须为零初始化

我错误地修复了一个错误,想了解原因

struct 中的qsort,但排序后的 struct 很乱

程序打印一些随机空行

无法理解 fgets 输出