[英]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;
在函数退出之前。
(顺便说一句, temp
在sentence
的生命周期内有效,除非它以任何方式被修改。)。
临时字符串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.