赋值从指针生成整数

时间:2015-04-07 10:00:04

标签: c pointers int addition assignment-operator

我有着名的

  

“赋值从没有强制转换的指针生成整数”

问题。我知道这意味着什么,但我找不到解决方法。 以下说明引起了问题

champ->instruction.instruction[i + 1] =
        (champ->pc + (champ->instruction.instruction[i + 1] % IDX_MOD));

champ->instruction.instructionint *

champ->pcunsigned char *,它计算数组的地址。

IDX_MOD是一个类似#define IDX_MOD 36的定义。

我可以通过声明一个变量来解决问题:unsigned char *tmp;

但是我不能把这个变量放在champ->instruction.instruction

任何人都可以有想法吗?

2 个答案:

答案 0 :(得分:1)

根据您的代码,

  • champ->instruction.instructionint *
  • champ->instruction.instruction[i + 1]int

  • champ->pcunsigned char *
  • champ->instruction.instruction[i + 1] % IDX_MOD会产生int
  • (champ->pc + (champ->instruction.instruction[i + 1] % IDX_MOD))收益unsigned char *

注意:[pointer + integer会产生pointer,而非integer]

所以,基本上,您尝试将unsigned char *分配给int。因此错误。

要保留(分配)unsigned char *的值,您需要一个类型为unsigned char *的左值。您可能希望将champ->instruction.instruction的类型更改为unsigned char **


编辑:

正如 @Eregrith先生在评论中所提到的,将champ->instruction.instruction更改为unsigned char **会产生使用atoi()strtol()的需要}。你需要照顾它。

否则,在将结果分配给LHS之前,可能想要取消引用 RHS指针。在这种情况下,您的表达式将类似于

champ->instruction.instruction[i + 1] =
     * (champ->pc + (champ->instruction.instruction[i + 1] % IDX_MOD));
     ^
     |
//dereference before assigning, will result in a char value, promoted to int.

答案 1 :(得分:0)

表达式

(champ->pc + (champ->instruction.instruction[i + 1] % IDX_MOD))

具有char *类型,并且尝试将其强制转换为int将导致编译器发出警告,因为C标准并不表示int与指针的大小相同。