【问题标题】:how can i cast void* to int correctly?我怎样才能正确地将 void* 转换为 int?
【发布时间】:2021-06-21 06:47:35
【问题描述】:

当我在学习 C 时,我发现了这个程序:

#include<stdio.h>
struct Base
{
void* data;
}
int main()
{
struct Base* base = (struct Base*)malloc(sizeof(struct Base));
if(!base) return -1;
int value = 90;
base->data = value;
printf("%d", base->data);
return 0;
}

编译时,输出“警告:从 int 分配给 void* 使指针从整数而不进行强制转换” 我该如何解决这个问题?

【问题讨论】:

  • 这不是您拥有的程序,它无法编译,因为您缺少分号。
  • 如果不告诉您需要做什么,也无法解决问题。但在这种情况下,最明智的做法是使用int data; 而不是void *data。也永远不要转换 malloc 的返回值 - 你缺少 #include &lt;stdlib.h&gt;,因此你的程序非常糟糕。
  • 复制粘贴您在发布问题时正在编译的确切代码
  • 通过#include &lt;stdlib.h&gt;提供malloc声明
  • 你在做什么没有意义。 int 不是 void *,尝试将整数值分配给 void * 是一场等待发生的灾难。 30 年前,将指针视为整数是很常见的,这导致了无数的编程错误。停止延续十年的不良做法。

标签: c pointers casting


【解决方案1】:

这将解决它。 data是一个指针,所以需要把它赋值给变量的地址:

base->data = &value;
printf("%d", *(int*)base->data);

如果你真的是在写你写的东西,但只是想摆脱警告,使用这个:

base->data = (void*)value;

但如果你这样做了,那就是你做错了什么的好兆头。

除此之外,Don't cast malloc

【讨论】:

  • 我想有可能,虽然不太可能,OP 使用data 的地址作为int 值。 base-&gt;data = (void *)value; value = (int)(base-&gt;data).
猜你喜欢
  • 1970-01-01
  • 2016-06-15
  • 2021-08-16
  • 1970-01-01
  • 2016-05-01
  • 2022-10-14
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多