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

标签 c gcc malloc

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/

相关文章:

c - LibAIFF 关闭文件 : Pointer being freed was not allocated occurs randomly

java - C/Java 之间的类似代理系统的实现提示

c - 读取所选目录中的 txt 文件

c++ - 错误 : expected identifier before string constant or error: 'perf' is not a type

c - 在 C 中访问结构体中的 void *

我可以根据 C 标准分配超过 65535 个字节吗?

c - 按 2 个参数对结构体数组进行排序

c - 使用 C 在 Linux 中轮询新文件的目录 - 一旦它出现,我是否需要等到它可以使用?

c - 使用C99标准导致GCC编译错误

c - Makefile - 对函数的 undefined reference