【问题标题】:Assigning Int value to *Char pointer将 Int 值分配给 *Char 指针
【发布时间】:2023-03-26 22:54:01
【问题描述】:

我正在研究指针算术,我的教授使用这样的代码:

int x = 0x01000000;
char *y = &x;
*(y+1) = 0x02;

将 x 变为 0x01020000,但即使第 2 行也无法在我的系统上编译,给我这个错误:warning: incompatible pointer types initializing 'char *' with an expression of type 'int *'

我怎样才能让它在没有警告的情况下运行?我没想到在我自己的电脑上复制简单的课堂材料会这么难。

【问题讨论】:

  • char *y = (char *)(&x) 呢?刚投。请注意,您不会在 little endian 系统上获得您想要的结果...
  • 请注意,这“只是”一个警告。你的教授显然不关心他们。但是除非你在一个大端机器上运行,使用 32 位整数你不会得到 0x1020000 而是 0x01000002
  • @Jean-FrançoisFabre 我将如何忽略该警告?
  • @Jean-FrançoisFabre:在 little-endian C 实现中,会得到 0x01000200,而不是 0x01000002。后者需要“混合端”实现。
  • @JohnDoe 它允许转换为任何指针类型。任何指针类型都可以转换为void * 并返回。

标签: c pointers types reference int


【解决方案1】:

您正试图将一个类型的变量放入另一个类型中。由于两者都是指针,编译器可以做到这一点,但会警告您可能由此导致的未定义行为影响。

如果你想忽略它,一些编译器有选项。 gcc-Wno-incompatible-pointer-types 选项。

但最好的方法是强制转换:

int x = 0x01000000;
char *y = (char*)&x;

附带说明,不保证这样做:

*(y+1) = 0x02;

x 变成0x01020000。只有在满足两个条件的情况下才会这样做:

  • 机器是大端
  • int 是 32 位大小

所以你看,玩指针转换需要你确切地知道你在做什么,否则你可能会遇到未定义的行为

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2019-05-18
    • 2018-10-06
    • 1970-01-01
    • 2015-10-26
    • 2011-04-02
    相关资源
    最近更新 更多