代码:
const char* copyoutmsg(unsigned char instring[2055])
{
char* msg = "";
const char* wholestring = reinterpret_cast<const char*>(instring);
strncpy(msg,wholestring,eotpos-5);
printf("Message: %sn",msg);
return msg;
}
这是 seg 错误(进程返回 139) - 无法理解它。Eotpos 是消息末尾的位置。此函数要做的是输入一个无符号的 char 数组,将其转换为 const char 并从末尾返回减去 5 个字符的消息。我看不出是什么原因造成的。
忽略代码中的所有其他问题,段错误源位于以下语句中:
char* msg = "";
const char* wholestring = reinterpret_cast<const char*>(instring);
strncpy(msg,wholestring,eotpos-5);
您正在尝试将wholestring
指向的字符串复制到msg
指向的内存位置。 msg
指向内存的只读部分,其中存储字符串文本(请参阅代码的第一条语句)。您需要先为消息分配内存:
char* msg = new char[eotpos - 5 + 1];
const char* wholestring = reinterpret_cast<const char*>(instring);
strncpy(msg,wholestring,eotpos-5);
之后不要忘记删除内存!
请注意,您不能从 C++11 中的字符串文本初始化char*
。删除了在 C++98 和 C++03 中允许初始化的子句。如果你弄清楚为什么会这样,你就会对一件出错的事情有所暗示!您可能还想阅读内存分配,或者更好的是,使用适当的C++工具,如std::string
,因为原始指针操纵器很难正确。
我可能是错的,但是您没有为msg
分配任何内存,当然,如果您尝试将字符串复制到其中,它会出错。
此外,如果eotpos
是最后一个消息字符的位置(并且它不指向字符串终止文本),则消息的长度为 eotpos+1
(没有字符串终止文本),因为计数从 0 开始。这就是为什么您必须为msg
分配eotpos+1-5+1
个字符(最后一个+1
用于字符串终止文本)。
像这样初始化msg
:
char* msg = malloc(eotpos-3); // Or new char[eotpos - 3], when I answered, there was still just the C tag
msg[eotpos-4] = 0;
然后复制:
strncpy(msg,wholestring,eotpos-4);
好吧,根据eotpos
到底是什么,您必须修复上面的常量值。但在我看来,你的描述有点价值。