p->;数据=(int*)malloc(sizeof(int));与(int*)p->;数据=(int*)malloc(sizeof(int));

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*

在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);
正确编译

在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
    进行转换纯粹是胡说八道