我刚刚开始一门关于C编程的课程,我一直使用malloc((函数。我有一个代码来实现一个分段的链接列表。
#include <stdlib.h>
#include <stdio.h>
typedef struct{
struct {
double x, y;
} point;
void *next;
void *prev;
} segment_t;
typedef struct {
segment_t *first;
segment_t *last;
} poly_t;
现在,如果我想为结构体segment_t
分配内存,我是否也应该为两个空指针*next
和*prev
分配内存?poly_t结构内的*first
和*last
也是如此?
谢谢你的帮助!
malloc(sizeof(segment_t))
为整个结构分配足够的内存,包括x
、y
、next
和prev
。
但是,它不会初始化这些成员中的任何一个。如果您希望next
和prev
指向某个内容,则需要为它们分配一个指针。无论是新分配的指针(malloc(...)
(还是现有的指针(包括NULL
(,都取决于您。
在这种特殊情况下,segment_t
的实例是双链表的节点。因此,s->next
和s->prev
应该被初始化为NULL
,直到节点(段(被添加到列表。
正如莫斯科的@Vlad所提到的,你不应该使用void*
作为指针,而是以下内容:
typedef struct segment {
struct {
double x, y;
} point;
struct segment *next;
struct segment *prev;
} segment_t;
对于初学者来说,不清楚为什么在结构中指针的类型为void*。这只会混淆结构定义的读者
typedef struct{
struct {
double x, y;
} point;
void *next;
void *prev;
} segment_t;
无论你是指
typedef struct{
struct point{
double x, y;
} point;
struct point *next;
struct point *prev;
} segment_t;
或者你是说
typedef struct segment {
struct {
double x, y;
} point;
struct segment *next;
struct segment *prev;
} segment_t;
因此,根据其用法更改结构定义。
如果您想为segment_t
或poly_t
类型的对象分配内存,那么最终应该初始化该对象。例如,next、prev、first和last指针最初可以由NULL初始化。