将值指定给取消引用的空指针 我正在做C++类,它支持任何一种变量来帮助我在未来的项目中。问题是,当我试图给void*变量赋值时,我得到了一个错误:void*不是指向对象类型的指针。代码如下: int main (void) { void* a; int x; a = malloc(sizeof(int)); x = 120; ((int)(*a)) = x; printf("%d",((int)*a)); free(a); system("pause"); return 0; }

将值指定给取消引用的空指针 我正在做C++类,它支持任何一种变量来帮助我在未来的项目中。问题是,当我试图给void*变量赋值时,我得到了一个错误:void*不是指向对象类型的指针。代码如下: int main (void) { void* a; int x; a = malloc(sizeof(int)); x = 120; ((int)(*a)) = x; printf("%d",((int)*a)); free(a); system("pause"); return 0; },c,C,我看到它就像我试图在为a保留的内存块中分配x的值。我希望存储在x中的值存储在a的内存块中。有人能帮我吗?首先,必须将a转换为适当的指针类型,然后取消引用它。其次,使用模板——这就是它们的用途。第三,malloc和free是Baaad,好吗?不要。如果你认为这是一个好代码,你需要严肃的补救C++。第四,这已经完成了-boost::任何都可以达到这个目的。你把它弄得太复杂了。只需将a转换为int*,或者最好先声明a为int* int x = 120; int * a ; // now just ca

我看到它就像我试图在为a保留的内存块中分配x的值。我希望存储在x中的值存储在a的内存块中。有人能帮我吗?

首先,必须将
a
转换为适当的指针类型,然后取消引用它。其次,使用模板——这就是它们的用途。第三,malloc和free是Baaad,好吗?不要。如果你认为这是一个好代码,你需要严肃的补救C++。第四,这已经完成了-
boost::任何
都可以达到这个目的。

你把它弄得太复杂了。只需将
a
转换为
int*
,或者最好先声明
a
为int*

int x = 120;
int * a ;
// now just cast the result from malloc as int*
if((a = (int *)malloc(sizeof(int))) == NULL){ //ALWAYS check
   exit(-1);
}
*a = x;

<>在C++中有类似的方法,但你似乎主要是在指针语法中。

你需要把这个转换成<代码> *(int *)(a)= x;<代码>

还有其他优雅的方法来分配不同类型的变量。对于您当前的问题,您可以遵循以下标准方式:

int* const a = new int;
//...
*a = 120;
//...
delete a;
或者只是针对这个问题

int a = 120; // simple
[注意:在您当前的解决方案中,如果您这样做

*((int*)(a)) = x;

它可能违反了严格的别名规则。]

您可能需要执行以下操作:

void* a;
int x;
a = malloc(sizeof(int));
x = 120;
*(int*)a = x;
printf("%d", * (int*)a);
free(a);

这就是我讨厌“C/C++”的原因@Charlie:是的,但他没有说“C”∩ C++“或”C∪ 不,但是他使用的东西只有C.@查利:这不构成C。他明确地说他将把它放在一个类中,在C++ C++中,他只标记C++。我想很清楚他在讨论什么语言。这并没有真正回答我的问题。。malloc和free可轻松更换。Boost:任何INS甚至不是C++标准类。这个问题只有知识的目的。在使用一个真正的类来理解我的程序发生了什么之前,了解事情是如何工作的是很重要的。我想,这可能会打破严格的别名规则,因为
(int*)(a)
还不是左值。@iammilind您能详细说明一下吗?你所说的打破严格的别名规则是什么意思?@user,参考这个。这完全避免了他关于malloc和void*@Charlie的问题,很明显,OP所做的一切都是不正确的,似乎不需要
malloc/void*