1

我在 C++ 中有一个我不理解的问题:我得到一个 unsigned char* 作为方法调用的结果。如果我迭代 char* 以显示数据一切都很好,但是当我只打印数据时,显示的值不一样。

这是我的代码示例:

unsigned char returning[32];
for(int i=0;i<32;i++){
    returning[i] = result[i];
    std::cout << returning[i];//return the good values
}
std::cout << "\n";
std::cout << returning << "\n";
//the first one are the good values, and then there are wrong

有人可以向我解释这种奇怪的行为吗?

4

2 回答 2

1

tl;博士:

unsigned char returning[33];
returning[32] = '\0';

固定的。

解释:

第一个循环将打印“返回”中的每个值。第二段代码只会返回值,直到它达到一个零值。然后它停止,因为 char 数组中的零被解释为行尾字符。

或者,如果“返回”任何地方都没有零,则第二段代码将继续写入随机值,直到它确实达到零。

于 2012-06-21T17:33:25.560 回答
1

首先在returning数组中,您只是将值分配到第 31 个索引,这是错误的。最后一个字节应该是空终止的\0

std::cout << returning[i]该语句将从该特定字符中读取 ASCII 值并打印相应的字符。

std::cout << returning但是该语句将继续读取字节,直到达到\0. 在您的情况下returning,数组未NULL终止。所以在这个缓冲区溢出会发生,它会打印前 32 个字节的正确字符,然后它会开始打印一些其他字符(也可能是不可读的正式字符)。如果\0永远不会进入更多字节,那么它肯定会尝试超出该段,那时应用程序将崩溃。

于 2012-06-21T18:36:24.343 回答