0

我不明白一些简单的事情。

我有这个示例代码:

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”出现分段错误?我究竟做错了什么?

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

4

3 回答 3

3

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

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

请注意,这会检查内存分配的结果。我不关心您是否将返回类型转换为malloc(); 其他人是。

于 2013-11-12T03:15:07.120 回答
1

您的PersonType结构包含一个指向您从未分配或分配的字符串的指针。fname您尝试写入的未初始化指针也是如此。您需要为fname.

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

要么,要么创建fname一个char数组,以便您的结构本身包含一个缓冲区。

于 2013-11-12T03:14:52.273 回答
0

fname没有初始化为任何东西。strcpy将继续从位置fname点开始读取,直到遇到\0.

要么创建fname一个数组,然后对其进行初始化。或者分配 fname 并初始化它。

于 2013-11-12T03:13:53.503 回答