繁体   English   中英

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

[英]Segmentation fault in constructor when using strcpy

嗨,大家好我正在编写一个程序,读取大学任务的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]; 我为null终止符添加了空间。 别忘了打电话给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, ",");
}

此外,您还不清楚如何确定字符串包含的部分数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM