为什么这个简单的strcpy(...)会导致分段错误?

时间:2013-11-12 03:11:05

标签: 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, name);

  printf("name: %s\n", p->fname);

}

为什么'strcpy'会出现分段错误?我究竟做错了什么?

非常感谢任何帮助,谢谢!

罗布

3 个答案:

答案 0 :(得分:4)

虽然您为结构分配了空间,但您既没有为字符串分配空间,也没有在结构中初始化指针。你需要使用类似的东西:

if (p != 0)
{
    if ((p->fname = malloc(strlen(name) + 1)) != 0)
        strcpy(p->fname, name);
    else
        free(p);  // Report error too?
}

请注意,这会检查内存分配的结果。我对你是否为malloc()转换返回类型并不感兴趣;其他人都是。

答案 1 :(得分:2)

您的PersonType结构包含一个指向您永远不会分配的字符串的指针,也不包含指定。因此fname是您尝试写入的未初始化指针。您需要为fname分配缓冲区。

int main() {
   PersonType *p;
   p  = (PersonType *)malloc(sizeof(PersonType));
   p->fname = malloc(sizeof(char)*7);
   char * name = "Robert";

要么使fname成为char数组,以便你的结构本身包含一个缓冲区。

答案 2 :(得分:1)

fname未初始化为任何内容。 strcpy将从位置fname开始继续阅读,直至遇到\0

使fname成为一个数组,并初始化它。或者分配fname并初始化它。