c - 这个小 C 指针让我困惑

标签 c pointers

这是一个完整的工作代码,只有一行代码让我感到困惑,我不明白。

如何以及为什么 cp[1] = 0 据我了解它应该是 01 或者?

#include <stdio.h>

int main(void){
char *cp;
short *sp;
int *ip;
short x[6];
int i, y;
y = 0x0102;
printf("y = %x\n" , y);
for(i = 0; i < 6; i++){
x[i] = y; y = y +0x1010;
}
printf("y = %x\n" , y);
printf("x[0] = %x\n" , x[0]);
printf("x[1] = %x\n" , x[1]);
printf("x[2] = %x\n" , x[2]);
printf("x[3] = %x\n" , x[3]);
printf("x[4] = %x\n" , x[4]);
printf("x[5] = %x\n" , x[5]);
cp = (char*) x;
printf("1)*cp = %x\n" , *cp);
sp = x;
printf("2)*sp = %x\n" , *sp);
printf("3)*cp[3] = %x\n" , cp[3]);
printf("3)*cp[6] = %x\n" , cp[6]);

ip = (int*) x;
printf("A)*ip = %x\n" , *ip);

ip = ip +1;
printf("B)*ip+1 = %x\n" , *ip);
printf("C)*cp[6] = %x\n" , cp[6]);

sp = sp +5;
printf("D)*sp +5 = %x\n" , *sp);

//change the content of x
*x = *cp + 2;

printf("E)*cp[1] = %x\n" , cp[1]);
printf("F)*cp[0] = %x\n" , cp[0]);

return 0;
}

output:

y = 102
x[0] = 102
x[1] = 1112
x[2] = 2122
x[3] = 3132
x[4] = 4142
x[5] = 5152
1)*cp = 2
2)*sp = 102
3)*cp[3] = 11
3)*cp[6] = 32
A)*ip = 11120102
B)*ip+1 = 31322122
C)*cp[6] = 32
D)*sp +5 = 5152
E)*cp[1] = 0
F)*cp[0] = 4

最佳答案

我的回答假定 short 的大小为 2。我也忽略了代码打破 strict aliasing rule 的事实。 (调高编译器优化级别,输出可能会改变)。

//change the content of x
*x = *cp + 2;   // this changes *x to 0x0004

*x 在您的系统上的大小为 2,因此分配它会同时修改 cp[0]cp[1]

因此,预期的输出是

E)*cp[1] = 0
F)*cp[0] = 4

E)*cp[1] = 4
F)*cp[0] = 0

取决于系统的字节顺序。

关于c - 这个小 C 指针让我困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52094351/

相关文章:

c - 用指针构建一个 strend 函数

c - 获得空闲时指向内存块的指针()不管指针是什么?

c++ - C 和 C++ 程序中堆栈溢出的常见原因是什么?

c# - 如何从 ORed 标志中检索返回值

c++ - (type)value 和 type(value) 这两个有什么区别?

c - 如何在 C 中使用 while 声明多个指针到指针?

CBLAS mac OS X 架构 x86_64 错误的 undefined symbol

c - 使用 epoll 时如何确保我阅读了完整的消息

c - 如何将另一个指针所指向的地址中存储的值赋给一个指向的指针的地址?

c - 无法将结构指针分配给内存数组