【问题标题】:why does this simple strcpy(...) cause a segmentation fault? [duplicate]为什么这个简单的 strcpy(...) 会导致分段错误? [复制]
【发布时间】:2013-11-24 01:41:56
【问题描述】:

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

我有这个示例代码:

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

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

罗伯

【问题讨论】:

  • 需要为fname分配空间;你的 malloc 只为指针本身分配空间。
  • 您还需要为 fname 分配内存。单独为 PersonType 分配内存是不够的。

标签: c pointers segmentation-fault malloc strcpy


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您的PersonType 结构包含一个指向您从未分配或分配的字符串的指针。所以fname 是您尝试写入的未初始化指针。你需要为fname分配一个缓冲区。

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

    要么这样做,要么将 fname 设为 char 数组,这样你的结构就会在其内部包含一个缓冲区。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-22
        • 2012-09-21
        • 2016-09-24
        • 2021-11-06
        • 2017-08-18
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        相关资源
        最近更新 更多