c - 使用指针类型转换时值发生莫名其妙的变化

标签 c pointers typecasting-operator

#include <stdio.h>
int main( void )
{ 
    int num = 1;
    char *b;

    b = (char*) &num;
    *(++b) = 2;
    printf("%d\n",num);

    return 0; 
}

Explanation : When I compiled this code , I encountered "513" as an output.When I use a comment line for that line: `*(++b)=2;

输出转换为“1”。

Question 1: Why did I encounter "513" as an output ?

Question 1: Why did output change when use comment line that I implied ?

最佳答案

假设 int 是 32 位的,在您的系统上采用小端字节序,num 的表示形式是 0x00000001,如下所示在内存中:

-----------------
| 1 | 0 | 0 | 0 |
-----------------

然后你将b指向num:

  b
  |
  v
-----------------
| 1 | 0 | 0 | 0 |
-----------------

然后你执行 *(++b)=2;,它递增 b,取消引用递增的指针,并将 2 写入该位置。所以你现在有了。

      b
      |
      v
-----------------
| 1 | 2 | 0 | 0 |
-----------------

所以现在 num 的表示是 0x00000201`,十进制是 513。

关于c - 使用指针类型转换时值发生莫名其妙的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53987898/

相关文章:

ios - 如何转换数字类型?

c - 类型转换指针

c - Flex - 检测 EOF 之前的单词

c - 使用字符串上的堆栈进行插入和弹出操作

c++ - "Un-casting"来自 (void *) 并取消对 char 数组的引用

c++ - 如果地址已知,如何获取指针变量的名称?

c++ - 类型转换的 C++ 指针和非类型转换指针指向相同的位置,但给出不同的值

c++ - 如何从 C++ 的 Windows 注册表中读取凭据缓存

c++ - Intel Core i7-3770 上的 ACML 5.3.1 段错误

从 char 转换为 long