【问题标题】:Segmentation fault when using strcpy to copy a "string" into a struct member char* [duplicate]使用 strcpy 将“字符串”复制到结构成员 char* 时出现分段错误 [重复]
【发布时间】:2014-03-11 00:48:42
【问题描述】:

我有一个指向我的struct gsa_sentence 的指针,它有一个char* 类型的结构成员,称为untouched_sentence

我的目标是使用 strcpy 将文件中的一行复制到这个结构变量中,但是我在 strcpy 函数调用中遇到了分段错误。

结构:

typedef struct gsa_sentence{

    char *untouched_sentence;
    char *sentence_id;
    char mode;
    int fix;
    int sv_1;
    int sv_2;
    int sv_3;
    int sv_4;
    int sv_5;
    int sv_6;
    int sv_7;
    int sv_8;
    int sv_9;
    int sv_10;
    int sv_11;
    int sv_12;
    int pdop;
    int hdop;
    int vdop;

}gsa_sentence;

strcpy 调用:

   gsa_sentence* gsa;

   gsa = malloc(sizeof(gsa_sentence));
   printf("%s", line);
    if(gsa != NULL){
       strncpy(gsa->untouched_sentence, line, strlen(line));
       printf("%s", gsa->untouched_sentence);
        }

我在代码的其他地方使用了 strcpy,它工作正常,我不知道发生了什么。

gdb 调试器说它肯定在 strcpy 函数调用上

【问题讨论】:

  • 很难说当您省略了line 的定义时。也就是说,您应该避免使用strcpy。使用更安全的strncpy

标签: c segmentation-fault


【解决方案1】:

Strcpy 正在尝试将字符复制到未初始化的字符缓冲区中。您还需要为untouched sentence 分配空间,或者将untouched sentence 重新分配给line 的内存地址。

或者,您可以更改结构的定义以包含默认分配的内存:

typedef struct gsa_sentence{

    char untouched_sentence[50];
    char sentence_id[50];
...

【讨论】:

  • 谢谢,这似乎奏效了 :) 抱歉,我的 C 语言真的很差!
  • 只要句子长度小于 50 就可以使用。最好的方法是使用strdup
  • 别担心,克里斯。一开始,C 语言对每个人来说都很困难,因为内存管理概念就是这样。
  • @Russell 我正在慢慢掌握它,感谢您花时间帮助我。我习惯了 Java,所以这是一个奇怪的概念。
【解决方案2】:

在复制数据之前,您需要为gsa->untouched_sentence 分配内存。您只是为结构本身分配内存。

【讨论】:

    【解决方案3】:

    你必须为 gsa->untouched_sentence 分配内存

    gsa->untouched_sentence = malloc ( strlen ( line ) + 1 );
    

    【讨论】:

      【解决方案4】:

      您必须为您的字符串分配空间:所有字符,加上分隔符。

      malloc (sizeof (gsa)) 不这样做:“sizeof (gsa)”只返回足够的指针 - 而不是整个字符串。

      'malloc (sizeof (gsa_sentence))or 'malloc (sizeof (gsa_sentence)+1) 会更好。但我也不确定这就是你想要的。

      【讨论】:

      • 我已经更新了我的代码,但我仍然遇到 seg 错误。我很困惑:/
      猜你喜欢
      • 2021-12-20
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 2017-09-12
      • 1970-01-01
      • 2019-05-09
      • 2021-07-19
      相关资源
      最近更新 更多