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));