为什么这个简单的strcpy(…)会导致分段错误?
我不明白一些简单的事情 我有以下示例代码:为什么这个简单的strcpy(…)会导致分段错误?,c,pointers,segmentation-fault,malloc,strcpy,C,Pointers,Segmentation Fault,Malloc,Strcpy,我不明白一些简单的事情 我有以下示例代码: typedef struct { char* fname; } PersonType; int main() { PersonType *p; p = (PersonType *)malloc(sizeof(PersonType)); char * name = "Robert"; /* this next line causes a segmentation fault */ strcpy(p->fname,
typedef struct {
char* fname;
} PersonType;
int main() {
PersonType *p;
p = (PersonType *)malloc(sizeof(PersonType));
char * name = "Robert";
/* this next line causes a segmentation fault */
strcpy(p->fname, name);
printf("name: %s\n", p->fname);
}
为什么“strcpy”上存在分段错误?我做错了什么
非常感谢您的帮助,谢谢
Rob
fname
未初始化为任何内容strcpy
将从fname
指向的位置开始继续读取,直到遇到\0
使
fname
成为一个数组,并对其进行初始化。或者分配fname并初始化它。fname
未初始化为任何内容strcpy
将从fname
指向的位置开始继续读取,直到遇到\0
使
fname
成为一个数组,并对其进行初始化。或者分配fname并初始化它。您的PersonType
结构包含一个指针,指向您从未分配或分配的字符串。因此,fname
是您试图写入的未初始化指针。您需要为fname
分配一个缓冲区
int main() {
PersonType *p;
p = (PersonType *)malloc(sizeof(PersonType));
p->fname = malloc(sizeof(char)*7);
char * name = "Robert";
或者将
fname
设置为char
数组,以便结构本身包含缓冲区。您的PersonType
结构包含指向您从未分配或分配的字符串的指针。因此,fname
是您试图写入的未初始化指针。您需要为fname
分配一个缓冲区
int main() {
PersonType *p;
p = (PersonType *)malloc(sizeof(PersonType));
p->fname = malloc(sizeof(char)*7);
char * name = "Robert";
或者将
fname
设置为char
数组,以便结构本身包含一个缓冲区。虽然为结构分配了空间,但您既没有为字符串分配空间,也没有初始化结构中的指针。您需要使用以下内容:
if (p != 0)
{
if ((p->fname = malloc(strlen(name) + 1)) != 0)
strcpy(p->fname, name);
else
free(p); // Report error too?
}
请注意,这将检查内存分配的结果。我并不担心是否为
malloc()
强制转换返回类型;其他人是。虽然您为结构分配了空间,但您既没有为字符串分配空间,也没有初始化结构中的指针。您需要使用以下内容:
if (p != 0)
{
if ((p->fname = malloc(strlen(name) + 1)) != 0)
strcpy(p->fname, name);
else
free(p); // Report error too?
}
请注意,这将检查内存分配的结果。我并不担心是否为
malloc()
强制转换返回类型;其他人是。您需要为fname分配空间;您的malloc只为指针本身分配空间。您还需要为fname分配内存。仅为PersonType分配内存是不够的。您需要为fname分配空间;您的malloc只为指针本身分配空间。您还需要为fname分配内存。仅为PersonType分配内存是不够的。