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)
提前致谢.
这些是等效的,并分配与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)