每次我研究列表时,我都会在代码中遇到与C语言实现的链接列表相同的行。我不明白我应该按照以下部分代码的方式:
Node*temp=(Node*)malloc(sizeof(struct Node))
我理解的是:malloc(sizeof(struct Node))
意味着我们要求内存创建一个内存块,并且作为参数,我们在块中插入我们想要的字节数。太棒了。我明白了。
但'Node*temp'
是什么意思?我知道temp是指向节点变量的指针,但它指向哪个节点?
(Node*)
malloc(sizeof(struct Node))
的含义也是如此
Node*temp=(Node*)malloc(sizeof(struct Node))
整体意味着什么?
答案 0 :(得分:2)
temp
指向您创建的空间。它只包含您使用malloc
创建的内存块开头的地址。
(Node*)
前面的malloc
是演员。 malloc
创建一个void指针(void *)
,因此包含(Node*)
以将其转换为Node
指针,以便类型匹配并可将其指定给{{1} }。
整个语句意味着"创建一个temp
变量大小的内存块,将其视为指向Node
变量的指针,并将位置保存在{{1}中}}"
答案 1 :(得分:2)
Node *temp
指向内存地址。该内存地址是从malloc
调用分配内存的位置。它并不一定意味着Node
位于该内存地址,但是在该位置的内存中创建了足够的空间来容纳Node
。稍后可以使用temp
指针来访问该内存位置。
答案 2 :(得分:0)
Node*temp=(Node*)malloc(sizeof(struct Node))
整体意味着什么?
声明类型为temp
的名为Node *
的变量。使用malloc
为单个struct Node
实例留出空间,并将指向该内存的结果指针分配给temp
。
这是一张图片:
temp struct Node block on heap
+---+ +---+---+---+---+---+
| |---------------------->| | | | | |
+---+ +---+---+---+---+---+
请注意temp
仅存在封闭函数的生命周期,但它指向的内存将保持分配,直到通过调用free
显式释放。
正如其他人所说,演员阵容在C中是多余的;这是一种更清晰的写作方式:
Node *temp = malloc( sizeof *temp );
表达式*temp
的类型是Node
,因此sizeof *temp
的结果与sizeof (Node)
相同(如果参数是类型名称,则必须使用括号)。这有助于防止出现像
T *ptr;
/**
* many lines of code here
*/
ptr = malloc( sizeof (T) );
并且您决定将类型T
更改为Q
,但您只记得为ptr
的声明执行此操作:
Q *ptr;
/**
* many lines of code here
*/
ptr = malloc( sizeof (T) );
如果sizeof (T)
< sizeof (Q)
,你会遇到问题。 OTOH,如果你写的话
ptr = malloc( sizeof *ptr );
您将始终分配适量的内存。任意类型T
的一般形式是
T *p = malloc( sizeof *p * number_of_elements );
如果您正在编写C ++,则应使用new
和delete
运算符,而不是malloc/calloc/realloc
和free
。是的,有些人喜欢将他们的代码编译为C 和 C ++,但我宁愿将这两种语言视为完全不同的语言(因为他们是)。