赛格在一辆汽车上出错,从无符号的字符转换为 const 字符 在C++



代码:

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到底是什么,您必须修复上面的常量值。但在我看来,你的描述有点价值。

最新更新