p->;数据=(int*)malloc(sizeof(int));与(int*)p->;数据=(int*)malloc(sizeof(int));
在gcc中:p->;数据=(int*)malloc(sizeof(int));与(int*)p->;数据=(int*)malloc(sizeof(int));,c,gcc,malloc,C,Gcc,Malloc,在gcc中: 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*
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);
正确编译
在gcc中:
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.
语句之间的区别在于,尝试在表达式的左侧指定指针类型是没有意义的,这就是您在
(int*)p->data
案例中所做的,因为p->data
始终是结构中定义的void*
。当编译器看到这一点时,它假定您正在将其强制转换为int*
,以便您可以读取它,即它成为一个r值,一个仅在赋值表达式右侧有效的值,而不是一个可以赋值的l值(左侧)
如果你想读/写一个存储在p->data
中的整数值,那么我认为最清晰的语法是*((int*)(p->data))
——也就是说,取p->data
指针,将其转换为int*
,然后取消引用它——但我确信,由于前面的规则,你可能会丢失一些括号
数据
为空指针;它不在乎你存储了什么,也就是说,你在malloc上的(int*)
转换实际上是浪费;它只关心您为它分配了一些内存。语句之间的区别在于,尝试在表达式的左侧指定指针类型是没有意义的,而这正是您在(int*)中所做的p->data
案例,因为p->data
始终是结构中定义的无效*
。当编译器看到这一点时,它假定您正在将其强制转换为int*
,以便您可以读取它,即它成为一个r值,一个仅在赋值表达式右侧有效的值,而不是一个可以赋值的l值(左侧)
如果你想读/写一个存储在p->data
中的整数值,那么我认为最清晰的语法是*((int*)(p->data))
——也就是说,取p->data
指针,将其转换为int*
,然后取消引用它——但我确信,由于前面的规则,你可能会丢失一些括号
数据
为空指针;它不在乎你存储了什么,也就是说,你在malloc上的(int*)
转换实际上是浪费;它只关心您给了它一些分配的内存。如何(int*&)p->data=(int*)malloc(sizeof(int))代码>“
(int*)给出指针本身的值,即它类似于说0x12345678=malloc(sizeof(int));
顺便说一句,对于像int这样小的东西进行mallocing是非常浪费的
编辑:
<>这可能只适用于C++,而不是C.</P>
首先为什么要强制转换?您正在将一个空指针指定给一个空指针。这不方便吗?为什么要强制转换
如果你真的想自娱自乐,你可以做一些傻事,比如*(int**)和(p->data)=(int*)malloc(sizeof(int));
。胡说八道,对吧?对。只需赋值。更好的是,用并集替换数据
那么(int*&)p->data=(int*)malloc(sizeof(int));
“
(int*)给出指针本身的值,即它类似于说0x12345678=malloc(sizeof(int))代码>
顺便说一句,对于像int这样小的东西进行mallocing是非常浪费的
编辑:
<>这可能只适用于C++,而不是C.</P>
你一开始为什么要选演员?您正在将一个空指针指定给一个空指针。那不方便吗?为什么要投
如果你真的想自娱自乐,你可以做一些傻事,比如*(int**)和(p->data)=(int*)malloc(sizeof(int))代码>。胡说八道,对吧?正当只需分配值。更好的办法是,用联合体替换数据
类型cast()的优先级高于->,因此第一个值等于((int*)p)-data。
我想那不是你想要的 type cast()的优先级高于->,因此第一个值等于((int*)p)-data。
我想那不是你想要的 是否有充分的理由在struct\u DListNode
中使用void*
而不是int*
?如果不需要,请将其更改为int*
,这样就不需要任何强制转换。首先,最好是使类型正确,而不是在代码中到处散布强制类型转换
你所得到的错误是因为你不能在作业的左边投石膏。这是违反规定的。你需要仔细阅读是什么以及它们之间的区别。是否有充分的理由在struct\u DListNode
中使用void*
而不是int*
?如果不需要,请将其更改为int*
,这样就不需要任何强制转换。首先,最好是使类型正确,而不是在代码中到处散布强制类型转换
你所得到的错误是因为你不能在作业的左边投石膏。这是违反规定的。你需要仔细阅读它们是什么以及它们之间的区别。那么,你的问题是什么?“差异”部分是什么意思
到目前为止,你的问题是
scanf("%d", (int*)p->data) ,
(int*)p->data = (int*)malloc(sizeof(int)),
p->data = (int*)malloc(sizeof(int));
这显然是一个无效的陈述。编译器已经告诉您了原因
那么,再一次,你的问题是什么?那么,你的问题是什么?“差异”部分是什么意思
到目前为止,你的问题是
scanf("%d", (int*)p->data) ,
(int*)p->data = (int*)malloc(sizeof(int)),
p->data = (int*)malloc(sizeof(int));
这显然是一个无效的陈述。编译器已经告诉您了原因
那么,再一次,你的问题是什么?在这两种情况下,你都不应该从malloc
进行转换-从void*
进行的转换在C中是隐式的。更不用说,数据
属于void*
类型,因此从malloc
进行转换纯粹是胡说八道