【问题标题】:invalid use of void expression - Adding 2 pointers of different type using typecasting无效使用无效表达式 - 使用类型转换添加 2 个不同类型的指针
【发布时间】:2014-11-30 07:06:50
【问题描述】:

所以我有三个指针变量,*segbase、*offset 和*data。 segbase 和 data 是 void 类型,但 offset 是 int。

我想要实现的是 - 获取 segbase 指向的内存地址,添加偏移量并将生成的内存地址复制到数据中。

由于 segbase 和 data 不是整数类型的指针,因此对它们进行类型转换是有意义的。但是,我在(int*)*data = (int*)*segbase + *offset; 行收到错误“无效表达式的使用”

int main()
{
    void *segbase;
    int *offset;
    void *data;

printf("\nAddress of segbase = %u", segbase);
printf("\nAddress of offset = %u", offset);
printf("\nAddress of data = %u", data);

printf("Now performing the function");

(int*)*data = (int*)*segbase + *offset;

printf("\nAddress of data = %u", data);

}

【问题讨论】:

  • 永远不要将指针转换为 int 如果您想将指针增加字节数,请将其转换为 char*其目标大小始终为一个字节。然后将其分配给左侧没有强制转换的 void 指针。
  • 那你建议我做什么来达到预期的效果?
  • 您说 offset 是 into 但您将其显示为 int*
  • 我建议想想你的代码做了什么。提示:类型转换表达式不是左值。

标签: c pointers casting type-conversion


【解决方案1】:

我认为你想要的,如果偏移量是字节偏移量,是

data = (void*)((char*)segbase + *offset);

一些 C 编译器处理偏移的 void* 指针,就好像它们是 char*,在这种情况下它是

data = segbase + *offset;

你确定 offset 也是一个指针而不是一个普通的 int 吗?

【讨论】:

  • 您仍然不应该使用 void* 进行算术运算,即使您碰巧使用的编译器没有抱怨。例如,GCC 会抱怨 -pedantic。
猜你喜欢
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多