使用 strcpy 时构造函数中的分段错误

Segmentation fault in constructor when using strcpy

本文关键字:分段 错误 构造函数 strcpy 使用      更新时间:2023-10-16

大家好,我正在编写一个为大学作业读取 NMEA 句子的程序,但我遇到了分割错误的问题。请问谁能帮我修复它?

NmeaSentence::NmeaSentence(std::string sentence) {
    const char *temp = sentence.c_str();
    char *c_sent;
    strcpy(c_sent, temp);
    char *pch;
    for(int i = 0; i < MAX_SENTENCE_PARTS; i++){
        pch = strtok(c_sent, ",");
        this->sentenceParts[i] = pch;
    }
    this->sentence = sentence;
    this->sentenceType = sentenceParts[0];
}

错误似乎发生在 strcpy。我做错了什么?

您不为 c_sent 分配内存。这是未定义的行为。

使用 char *c_sent = new char[sentence.size() + 1]; .我为空终止符添加了空间。不要忘记在函数退出之前调用delete[] c_sent;

(顺便说一下,tempsentence的生命周期内有效,除非以任何方式对其进行修改。

临时字符串c_sent未初始化。

char * c_sent

char * c_sent = strdup(sentence.c_str());

不要忘记在退出之前自由。

free(c_sent);

这样你不需要临时工。

成员函数有几个缺陷。

如果函数的参数没有更改,那么最好将函数声明为

NmeaSentence::NmeaSentence( const std::string & sentence);

正如已经说过的那样,您没有在要复制句子的位置分配内存。指针 c_sent 未由分配的内存的地址初始化。

第二个缺陷是 pch 总是指向 c_sent 中的相同地址,因为您错误地使用了函数 strtok。您应该通过以下方式使用它

char *pch = strtok(c_sent, ",");
for(int i = 0; i < MAX_SENTENCE_PARTS && pch; i++){
    this->sentenceParts[i] = pch;
    pch = strtok( NULL, ",");
}

此外,不清楚您将如何确定字符串包含多少部分。