strcpy()中的分段错误

我有这样的基本结构

typedef struct struck { char* id; char* mat; int value; char* place; } *Truck; 

像这样的function创建了该结构的新“实例”:

 Truck CTruck(char* id, char* mat, int value, char* place) { Truck nT = (Truck) malloc(sizeof (Truck)); nT->value = value; strcpy(nT->id, id); strcpy(nT->mat, mat); strcpy(nT->place, place); return nT; } 

我在第一个strcpy遇到错误。 它编译没有问题。

你的typedef将Truck定义为一个struct struck * ,即一个指针。 所以它的大小将是48具体取决于体系结构而不是结构的大小

使用sizeof(*Truck)来获取结构的实际大小。

您还需要为字符分配内存。 最简单的方法是使用strdup()

 Truck CTruck(const char* id, const char* mat, int value, const char* place) { Truck nT = malloc(sizeof (*Truck)); nT->value = value; nT->id = strdup(id); nT->mat = strdup(mat); nT->place = strdup(place); return nT; } 

但是,我建议更改你的typedef,因此它是struct的别名,而不是指向它的指针:

 typedef struct { char* id; char* mat; int value; char* place; } Truck; 

在你的function中,你使用这个:

 Truck *nT = malloc(sizeof(Truck)); 

nT->id只是一个指针。 需要malloc内存才能将字符串复制到。 与其他人一样。

您对sizeof使用不正确。 通常, malloc()的参数必须是“返回指针指向的大小”。 换句话说,你需要sizeof *nT 。 看看如何消除重复类型名称( Truck )?

另外,在C中你不需要转换malloc()的返回值 ; 它没有任何意义,可以隐藏实际错误,并使代码更难阅读。

正如其他人所指出的那样,你也没有为任何字符串数据分配空间,你所拥有的只是你结构中的指针。