C编程.指向结构的指针

Jam*_*eal 3 c stack pointers structure list

这是我的第一篇文章.我对C的指针及其与struct的关系非常困惑.我搜索了更多信息,但无法真正得出结论.例如,给定此结构定义

typedef struct node
{
     int info;
     struct node *next;
}NODE;
Run Code Online (Sandbox Code Playgroud)

那么这四个宣言的差异和影响是什么呢?

1. NODE *node1 = malloc (sizeof(NODE));
2. NODE *node1 = (struct node *) malloc (sizeof(NODE));
3. NODE *node1 = (struct node *) malloc (sizeof(NODE *));
4. NODE *node1 = malloc (sizeof(NODE *));
Run Code Online (Sandbox Code Playgroud)

提前致谢.

kdo*_*pen 6

这些是等效的,并分配与NODE结构相同大小的内存块.

1. NODE *node1 = malloc (sizeof(NODE));
2. NODE *node1 = (struct node *) malloc (sizeof(NODE));
Run Code Online (Sandbox Code Playgroud)

这些都是错的

3. NODE *node1 = (struct node *) malloc (sizeof(NODE *));
4. NODE *node1 = malloc (sizeof(NODE *));
Run Code Online (Sandbox Code Playgroud)

第3行分配一个指向NODE结构的指针大小的内存块.强制转换允许您分配它而不会抛出任何错误,并且可能没有警告.但这不是你想要的.

第4行与第3行相同.malloc返回void *不需要转换的a,但是一个好的静态分析器应该给你一个警告.

无论哪种方式,第3行和第4行都是缓冲区溢出和未定义行为的配方.

如果这样写的话,第3行和第4行是正确的:

NODE **ptr = malloc(sizeof(NODE *));
Run Code Online (Sandbox Code Playgroud)