我想了解有关链表的代码行

时间:2014-08-21 20:56:49

标签: c linked-list

每次我研究列表时,我都会在代码中遇到与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))整体意味着什么?

3 个答案:

答案 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 ++,则应使用newdelete运算符,而不是malloc/calloc/reallocfree。是的,有些人喜欢将他们的代码编译为C C ++,但我宁愿将这两种语言视为完全不同的语言(因为他们)。