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 *
,即一个指针。 所以它的大小将是4
或8
具体取决于体系结构而不是结构的大小
使用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()
的返回值 ; 它没有任何意义,可以隐藏实际错误,并使代码更难阅读。
正如其他人所指出的那样,你也没有为任何字符串数据分配空间,你所拥有的只是你结构中的指针。