c-建筑物内的马洛克



我刚刚开始一门关于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))为整个结构分配足够的内存,包括xynextprev

但是,它不会初始化这些成员中的任何一个。如果您希望nextprev指向某个内容,则需要为它们分配一个指针。无论是新分配的指针(malloc(...)(还是现有的指针(包括NULL(,都取决于您。

在这种特殊情况下,segment_t的实例是双链表的节点。因此,s->nexts->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_tpoly_t类型的对象分配内存,那么最终应该初始化该对象。例如,next、prev、first和last指针最初可以由NULL初始化。

最新更新