typedef struct _DListNode
{
struct _DListNode* prev;
struct _DListNode* next;
void* data;
}DListNode;
在海湾合作委员会中:
DListNode *p = NULL;
p = (DListNode*)malloc(sizeof(DListNode));
p->data = (int*)malloc(sizeof(int));
scanf("%d", (int*)p->data);
正确编译。
在海湾合作委员会中:
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));
最佳答案
语句之间的区别在于,尝试在表达式左侧指定指针类型是没有意义的,而这正是您在 (int*)p 中所做的->data
大小写,因为 p->data
始终是结构中定义的 void*
。当编译器看到它时,它假设您正在将它转换为 int*
以便您可以读取它,即它变成一个右值,一个仅在右侧有效的值-赋值表达式的一侧不是可以分配给的左值(左侧)。
如果你想读取/写入存储在p->data
中的整数值,那么我认为最清晰的语法是*((int*)(p->data))
- 即获取 p->data
指针,将其转换为 int*
然后取消引用它 - 但我相信你会丢失一些括号由于优先规则。
data
是一个空指针;它不关心你在其中存储什么,即你在 malloc 上的 (int*)
被有效地浪费了;它只关心你给它分配了一些内存。
关于c - p->data = (int*)malloc(sizeof(int));比较 (int*)p->data = (int*)malloc(sizeof(int));,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3571247/