Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中,从无符号字符到常量字符的car上的Seg断层+;_C++ - Fatal编程技术网

C++ 在C+中,从无符号字符到常量字符的car上的Seg断层+;

C++ 在C+中,从无符号字符到常量字符的car上的Seg断层+;,c++,C++,代码: const char*copyoutmsg(unsigned char instring[2055]) { char*msg=“”; const char*whisttring=reinterpret_cast(instring); strncpy(味精、批发、eotpos-5); printf(“消息:%s\n”,msg); 返回味精; } 这是seg故障(流程返回139)-我无法控制它。Eotpos是消息结尾的位置。此函数的作用是输入一个无符号字符数组,将其转换为const

代码:

const char*copyoutmsg(unsigned char instring[2055])
{    
char*msg=“”;
const char*whisttring=reinterpret_cast(instring);
strncpy(味精、批发、eotpos-5);
printf(“消息:%s\n”,msg);
返回味精;
}

这是seg故障(流程返回139)-我无法控制它。Eotpos是消息结尾的位置。此函数的作用是输入一个无符号字符数组,将其转换为const char,并返回从末尾减去5个字符的消息。我看不出这是什么原因。

请注意,在C++11中,您不能从字符串文本初始化
char*
。删除了允许在C++98和C++03中进行初始化的子句。如果你弄清楚了原因,你就知道有一件事出了差错!您可能希望阅读内存分配,或者更好地使用适当的C++设备,如“代码> STD::String < /Cord>”,因为原始指针操作器相当难正确。

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

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;    
}

以后别忘了删除内存

我可能错了,但是您没有为
msg
分配任何内存,当然,如果您尝试将字符串复制到它,它将出错

此外,如果
eotpos
是最后一个消息字符的位置(且不指向字符串终止文字),则消息的长度为
eotpos+1
(不含字符串终止文字),因为计数从0开始。这就是为什么您必须为
msg
分配
eotpos+1-5+1
字符(最后一个
+1
用于字符串终止文字)

初始化
msg
如下:

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

char* msg = malloc(eotpos-3); // Or new char[eotpos - 3], when I answered, there was still just the C tag
msg[eotpos-4] = 0;

嗯,根据
eotpos
的实际情况,您必须修正上面的常量值。但在我看来,你的描述有点价值。

你自己的错是没有注意到编译器警告,甚至没有启用编译器警告……此外,这个问题与C++@Manu无关。不正确,C中没有
重新解释
。因此,这个问题被正确地标记了。@ MUA33626,你所回避的是越来越猖獗的站点范围的观点,除非你用C++标准库(C标准库的超集)编码,否则你不能用C++编码,这是不正确的。我同意任何想使用C++而不利用快乐世界的人,它的库与RAII提供的是对他们自己的伤害,但这是他们的葬礼。@ MAN324726:问题的关键部分,即字符串文字的类型,在C和C++中是不同的,所以标记是重要的。
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);