我有着名的
“赋值从没有强制转换的指针生成整数”
问题。我知道这意味着什么,但我找不到解决方法。 以下说明引起了问题
champ->instruction.instruction[i + 1] =
(champ->pc + (champ->instruction.instruction[i + 1] % IDX_MOD));
champ->instruction.instruction
是int *
。
champ->pc
是unsigned char *
,它计算数组的地址。
IDX_MOD
是一个类似#define IDX_MOD 36
的定义。
我可以通过声明一个变量来解决问题:unsigned char *tmp;
但是我不能把这个变量放在champ->instruction.instruction
。
任何人都可以有想法吗?
答案 0 :(得分:1)
根据您的代码,
champ->instruction.instruction
是int *
champ->instruction.instruction[i + 1]
是int
和
champ->pc
是unsigned 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与指针的大小相同。