为什么这个简单的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分配内存是不够的。