【问题标题】:assignment makes integer from pointer赋值从指针生成整数
【发布时间】:2015-06-11 21:19:08
【问题描述】:

我有名的

“赋值使指针变成整数而不需要强制转换”

问题。我知道这意味着什么,但我找不到解决它的方法。 以下指令导致了问题

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中。

任何人都可以有一个想法吗?

【问题讨论】:

  • 请编辑您的问题以显示更多声明(例如*champ、champ->instruction 等类型)
  • 您是否尝试访问champ->pc 的第p 个元素?那么champ->pc[champ->instruction.instruction[i + 1] % IDX_MOD] 不会工作吗?
  • 解释更多关于你想要做什么的信息。很明显,您将 unsigned char * 分配给 int ,这是一个错误,您似乎明白这一点,但在不知道您的目标是什么的情况下,很难提出行动方案。您能否提供更多背景信息或举例说明您期望的结果类型?

标签: c pointers int addition assignment-operator


【解决方案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 **。


编辑:

正如 @Eredrith 先生在 cmets 中提到的,将 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.

【讨论】:

  • 我不知道它是否可行,因为 champ->instruction.instruction 有时需要存储 4 个字节。
  • @DimitriDanilov 这取决于你的设计,我们只能评论这里显示的代码。但是,仅供参考,您知道 通常 int * 和 char * 变量占用相同的空间,对吧?
  • 请注意,将champ->instruction.instruction 更改为unsigned char** 会在尝试计算% IDX_MOD 时调用atoi 或类似名称
  • @Eregrith 谢谢!!我错过了那部分。将在我的答案中解决同样的问题。 :-)
  • @SouravGhosh 非常感谢,我尝试先用 unsigned char ** 声明指令,但这会产生很多问题。所以尝试了 champ->instruction.instruction[i + 1] = * (champ->pc + (champ->instruction.instruction[i + 1] % IDX_MOD));它工作正常!
【解决方案2】:

表达式

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

具有 char* 类型,尝试将其转换为 int 会导致编译器发出警告,因为 C 标准并未规定 int 与指针的大小相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 2011-07-04
    • 2017-05-06
    • 2015-10-19
    相关资源
    最近更新 更多