【问题标题】:Cast pointer type in CC中的转换指针类型
【发布时间】:2017-01-30 05:31:06
【问题描述】:
#include <stdio.h>

  int main () {
      char c = 'A';
      int *int_ptr;
      double *double_ptr;

      *int_ptr = *(int *)&c;
      *double_ptr = *(double *)&c;

      printf("Original char = %c \n", c);
      printf("Integer pointer = %d \n", *int_ptr);
      printf("Double pointer = %f\n", *double_ptr);

      return 0;
  }

问题是——为什么我不能使用这段代码分配double_ptr,因为它会导致分段错误,但对于整数却可以正常工作?

据我了解,char 是 1 字节长,int 是 4 字节长,所以 double 是 8 字节长。

通过使用表达式*(double *)&amp;c,我期望得到以下结果:

  1. &——获取c的内存地址。
  2. (double *) – 假装这是一个指向 double 的指针。
  3. *() – 获取实际值并将其分配给 double var。

【问题讨论】:

  • 1) 你知道你在做什么是“错误的”。 2) 如果你很好奇为什么会出现分段错误,为什么不用 -S (gcc) 或 /Fa (MSVC) 编译并查看汇编输出?
  • 首先,指针后面没有任何内存,所以 *int_ptr 正在寻址不属于您的内存,即 UB。您甚至不知道指针未初始化的位置。除此之外,您尝试使用 int(4 或 8 个字节)读取一个 char(1 个字节),这又是 UB。

标签: c pointers


【解决方案1】:

您的代码具有未定义的行为。因此,任何事情都可能发生。

UB 是因为您将一个字节的 char 转换为 4 和 8 字节的类型,这意味着您(可能)访问内存越界或对齐错误。

其中任何一个在任何特定系统上“有效”还是“无效”都不是很相关,因为代码是错误的。

【讨论】:

    【解决方案2】:

    在您的程序中,将char 类型转换为int*double*,然后取消引用会从内存中获取一些额外的字节,这是未定义的行为

    【讨论】:

      猜你喜欢
      • 2020-11-17
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2014-08-14
      相关资源
      最近更新 更多