strcpy()中的分段错误
我有一个这样的基本结构strcpy()中的分段错误,c,segmentation-fault,strcpy,C,Segmentation Fault,Strcpy,我有一个这样的基本结构 typedef struct struck { char* id; char* mat; int value; char* place; } *Truck; 这样的函数会创建该结构的新“实例”: Truck CTruck(char* id, char* mat, int value, char* place) { Truck nT = (Truck) malloc(sizeof (Truck)); nT->value
typedef struct struck {
char* id;
char* mat;
int value;
char* place;
} *Truck;
这样的函数会创建该结构的新“实例”:
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中得到一个错误。它编译起来没有问题。
nT->id
只是一个指针。需要malloc
内存才能将字符串复制到内存中。其他的也一样。您的typedef将Truck
定义为struct-struct-struct*
,即指针。因此,它的大小将是4
或8
,这取决于体系结构,而不是结构的大小
使用sizeof(*Truck)
获取结构的实际大小
您还需要为字符分配内存。最简单的方法是使用strdup()
但是,我建议更改typedef,使其成为结构的别名,而不是指向结构的指针:
typedef struct {
char* id;
char* mat;
int value;
char* place;
} Truck;
在您的功能中,您可以使用:
Truck *nT = malloc(sizeof(Truck));
您使用的
sizeof
不正确。通常,malloc()
的参数需要是“返回指针指向的对象的大小”。换句话说,您需要sizeof*nT
。请参见如何避免重复类型名称(Truck
)
还有,在C你;它没有任何用途,可以隐藏实际错误,并使代码更难阅读
正如其他人所指出的,您也没有为任何字符串数据分配空间,您所拥有的只是结构中的指针。+1还为id、mat和place分配一些空间,以便strcpy不会删除随机内存。
strdup
ftw;不需要使用malloc和那种讨厌的strcpy
我有更多的结构在typedef的末尾使用*Stuff,如果我把它改为}Truck,它会在每一个结构上产生错误,malloc(sizeof(Truck))
如果我使用*TruckAlright,我想问题也在使用strcpy上,我不知道strdpy,感谢all+1告诉此人使用typedef
作为struct
Truck *nT = malloc(sizeof(Truck));