0

代码:

const char* copyoutmsg(unsigned char instring[2055])    
{    
    char* msg = "";    
    const char* wholestring = reinterpret_cast<const char*>(instring);    
    strncpy(msg,wholestring,eotpos-5);    
    printf("Message: %s\n",msg);    
    return msg;    
}

这是段错误(进程返回 139) - 我无法理解它。Eotpos 是消息结束的位置。这个函数的目的是输入一个 unsigned char 数组,将其转换为 const char 并返回从末尾减去 5 个字符的消息。我看不出是什么原因造成的。

4

3 回答 3

1

忽略代码中的所有其他问题,段错误源在这些语句中:

char* msg = "";    
const char* wholestring = reinterpret_cast<const char*>(instring);    
strncpy(msg,wholestring,eotpos-5);    

您正在尝试将指向的字符串复制到指向wholestring的内存位置msgmsg指向内存的只读部分,其中存储了字符串文字(请参阅代码的第一条语句)。您需要先为消息分配内存:

char* msg = new char[eotpos - 5 + 1];    
const char* wholestring = reinterpret_cast<const char*>(instring);    
strncpy(msg,wholestring,eotpos-5);    

之后不要忘记删除内存!

于 2013-09-14T11:28:46.483 回答
1

请注意,您不能char*在 C++11 中从字符串文字初始化 a 。删除了允许在 C++98 和 C++03 中进行初始化的子句。如果你弄清楚了为什么会这样,你就会对出错的一件事有所暗示!您可能还想了解内存分配,或者更好的是,使用适当的 C++ 工具,例如std::string原始指针操纵器很难正确处理。

于 2013-09-14T11:17:13.417 回答
0

我可能错了,但是您没有为 分配任何内存msg,当然,如果您尝试将字符串复制到其中,则会出现段错误。

此外,如果eotpos是最后一个消息字符的位置(并且它不指向字符串终止文字),则消息的长度为eotpos+1(没有字符串终止文字),因为计数从 0 开始。这就是为什么你会必须为(最后一个用于字符串终止文字)分配eotpos+1-5+1字符。msg+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实际情况,您必须修复上面的常量值。但在我看来,你的描述有点价值。

于 2013-09-14T11:36:19.560 回答