【问题标题】:Casting an int pointer to a char ptr and vice versa将 int 指针转换为 char ptr,反之亦然
【发布时间】:2011-05-16 12:25:53
【问题描述】:

问题很简单。据我了解,GCC 认为在 32 位环境中 chars 将是字节对齐的,ints 是 4 字节对齐的。我也知道 C99 标准 6.3.2.3,它说在未对齐的指针类型之间进行转换会导致未定义的操作。 C 的其他标准对此有何评论?这里也有许多经验丰富的编码人员 - 对此的任何看法将不胜感激。

int *iptr1, *iptr2;
char *cptr1, *cptr2;

iptr1 = (int *) cptr1;
cptr2 = (char *) iptr2;

【问题讨论】:

  • 从 int* 转换为 char* 总是有效的。反过来,在某些 CPU 上它可以工作,而在其他 CPU 上则不行。
  • 如果您有兴趣,以下检查一个特定案例:stackoverflow.com/q/25994127/2436175

标签: c pointers types casting c89


【解决方案1】:

只有一个 C 标准(ISO 的一个),有两个版本(1989 和 1999),加上一些非常小的修订。所有版本和修订都同意以下内容:

  • 所有数据存储器都是字节可寻址的,字符是字节
  • 因此char* 将能够处理任何数据
    • void*char* 相同,只是与它的转换不需要类型转换
  • int* 转换为char* 始终有效,转换回int* 也是如此
  • 无法保证将任意 char* 转换为 int* 工作

char 指针能够保证这样工作的原因是,例如,您可以将整数从内存中的任何位置复制到内存或磁盘中的其他位置,然后再复制回来,结果证明这是一件非常有用的事情低级编程,例如图形库。

【讨论】:

  • "void* 与 char* 相同,只是与它的转换不需要类型转换" - 也不能添加/减去它们。
【解决方案2】:

CPU 有 big-endian 和 little-endian,所以结果是不确定的。 例如,0x01234567 的值可以是 0x12 或 0x67 用于转换后的 char 指针。

【讨论】:

    【解决方案3】:

    你可以试试:

    iptr1 = atoi(cptr1); // val now = pointed by cptr1
    cptr2 = atoi(iptr2); // val now = pointed by iptr2
    

    这在 DevCpp 中对我有用!

    【讨论】:

      猜你喜欢
      • 2020-03-01
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 2021-01-01
      • 1970-01-01
      • 2014-05-20
      相关资源
      最近更新 更多