p-> data =(int *)malloc(sizeof(int));比较(int *)p-> data =(int *)malloc(sizeof(int));

时间:2010-08-26 00:26:46

标签: c gcc malloc

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));

5 个答案:

答案 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非常浪费。

编辑:

  1. 这可能仅适用于C ++,而不适用于C.

  2. 你为什么要放在第一位?您正在为void指针指定一个void指针。那不方便吗?为什么演员?

  3. 如果你真的想逗你自己,你可以做一些愚蠢的事情,比如*(int **) &(p->data) = (int *) malloc(sizeof(int));。废话,对吧?对。只需指定值即可。更好的是,用工会替换你的数据。

答案 3 :(得分:0)

类型cast()的优先级高于 - >,所以你的第一个等于((int *)p)-data。 我想那不是你想要的。

答案 4 :(得分:0)

那么,你的问题是什么?什么是“差异”部分应该是什么意思?

到目前为止,你已经遇到了问题

(int*)p->data = (int*)malloc(sizeof(int));

这显然是一个无效的陈述。编译器已经告诉你原因了。

那么,再一次,你的问题是什么?