typedef struct _DListNode
{
struct _DListNode* prev;
struct _DListNode* next;
void* data;
}DListNode;
在gcc中:
DListNode *p = NULL;
p = (DListNode*)malloc(sizeof(DListNode));
p->data = (int*)malloc(sizeof(int));
scanf("%d", (int*)p->data);
正确编译。
在gcc中:
DListNode *p = NULL;
p = (DListNode*)malloc(sizeof(DListNode));
(int*)p->data = (int*)malloc(sizeof(int));
scanf("%d", (int*)p->data);
有一个问题:
(int*)p->data = (int*)malloc(sizeof(int)); -------error: lvalue required as left operand of assignment.
差异:
scanf("%d", (int*)p->data) ,
(int*)p->data = (int*)malloc(sizeof(int)),
p->data = (int*)malloc(sizeof(int));
答案 0 :(得分:2)
语句之间的区别在于,尝试在表达式的左侧指定指针类型是没有意义的,这是您在(int*)p->data
情况下所做的事情,因为{ {1}}始终是结构中定义的p->data
。当编译器看到它时,它会假定你将它转换为void*
,以便你可以读取它,即它变成一个r值,这个值只在赋值的右边有效表达式不是可以赋值的l值(左侧)。
如果你想读/写int*
中存储的整数值,那么我认为最清晰的语法是p->data
- 即取*((int*)(p->data))
指针,将其转换为{{1}然后取消引用 - 但我确信由于优先级规则,你可能会丢失一些括号。
p->data
是一个无效指针;它并不关心你存储在它里面的东西,即你在malloc上的int*
施法被有效地浪费掉了;它只关心你给它一些分配的内存。
答案 1 :(得分:2)
是否有充分的理由在void*
中拥有int*
而不是struct _DListNode
?如果没有,请将其更改为int*
,然后您不需要任何演员阵容。最好先让这些类型变得正确,而不是在代码中撒上强制转换。
您得到的错误是因为您根本无法在作业的左侧放置演员表。这是违反规则的。您需要了解lvalues and rvalues是什么以及它们之间的区别。
答案 2 :(得分:1)
(int*&)p->data = (int*)malloc(sizeof(int));
“怎么样?
(int *)给出指针值本身,即它类似于0x12345678 = malloc(sizeof(int));
。
顺便说一句,对像int这样小的东西进行mallocing非常浪费。
编辑:
这可能仅适用于C ++,而不适用于C.
你为什么要放在第一位?您正在为void指针指定一个void指针。那不方便吗?为什么演员?
如果你真的想逗你自己,你可以做一些愚蠢的事情,比如*(int **) &(p->data) = (int *) malloc(sizeof(int));
。废话,对吧?对。只需指定值即可。更好的是,用工会替换你的数据。
答案 3 :(得分:0)
类型cast()的优先级高于 - >,所以你的第一个等于((int *)p)-data。 我想那不是你想要的。
答案 4 :(得分:0)
那么,你的问题是什么?什么是“差异”部分应该是什么意思?
到目前为止,你已经遇到了问题
(int*)p->data = (int*)malloc(sizeof(int));
这显然是一个无效的陈述。编译器已经告诉你原因了。
那么,再一次,你的问题是什么?