C++ bzero和将char数组设置为'\0';?
我目前有一个功能:C++ bzero和将char数组设置为'\0';?,c++,buffer,C++,Buffer,我目前有一个功能: void clearBuffer(char* buffer, int length) { for(int i=0; i < length; i++){ buffer[i] = '\0'; } } 实施: Message::Message() { clearBuffer(msg, MAXLEN); } 只是为了好玩,我将函数改为使用bzero: void clearBuffer(char* buffer, int length) { bze
void clearBuffer(char* buffer, int length)
{
for(int i=0; i < length; i++){ buffer[i] = '\0'; }
}
实施:
Message::Message()
{
clearBuffer(msg, MAXLEN);
}
只是为了好玩,我将函数改为使用bzero
:
void clearBuffer(char* buffer, int length)
{
bzero(buffer, length);
}
现在函数运行了,我没有收到非法指令
错误
这两个功能不相等吗?首先是什么导致了错误
注意:我只有在我的一个虚拟机上运行代码时才会遇到这个问题。当我在真正的生产机器上运行时,没有出现非法指令。你使用什么编译器?与原始的
clearBuffer()
之间的主要区别是bzero()
可能快得多。如果上述代码崩溃,可能除了这两个函数之间的差异之外,还有其他原因在起作用:错误的描述听起来像是在覆盖堆栈,例如,通过执行char buffer[1]来实现;新(缓冲区)消息()
。MAXLEN
在你所有的翻译单位中都是一样的吗?将调用替换为clearBuffer(msg,sizeof msg)
。我很可能只需将msg()
放在构造函数初始值设定项列表中,并将其调用一天。然而,这是一个更大的问题的根源,要么是消息
对象本身在伪内存中被实例化,要么正如Kerrek指出的那样,在翻译单元之间存在冲突的MAXLEN
。可能需要更多的代码(具体地说,是促使构建的堆栈的更上层的代码)。@Pavel Anossov我使用的是g++-4.7
。另一个奇怪的是,我只有一台虚拟机有这个问题。当我在真正的生产机器上运行这个时,没有出现非法指令。
void clearBuffer(char* buffer, int length)
{
bzero(buffer, length);
}