byte [] C++的奇怪行为

Jkh*_*kh2 0 c++ arrays

我一直在编写一些代码来创建一个字节数组,我将通过套接字发送到另一个进程.但是注意到我的byte []有些奇怪的行为.

最后的cout打印出99,但是看着我的代码,我找不到设置值的位置.我创建了一个大小为invoiceSize的char数组,它是一个常量.我没有设置值307200*3所以我不明白它是如何打印出一个值...

char tosend[sendingSize];
//Send over the frame
for(int i = 0; i < 307200; i++)
{
    tosend[i * 3] = (byte)imCopy[i/640][i%640].red;
    tosend[i * 3+1] = (byte)imCopy[i/640][i%640].green;
    tosend[i * 3+2] = (byte)imCopy[i/640][i%640].blue;
}

char *bytePointer = tosend;

cout<<(int)tosend[307200* 3]<<endl;
Run Code Online (Sandbox Code Playgroud)

Gre*_*ill 7

您的代码不会将任何值写入索引307200*3(因为您的for循环达到的最高索引是307199).因此,您正在读取内存中超出声明的数组大小的字节.这是未定义的行为,任何事情都可能发生.

其他一些编程语言(如Java)对数组进行自动范围检查,在这种情况下会引发异常.在C++中,您需要做正确的事情,编译器不会为您生成范围检查代码.

  • @ Jkh2:我不确定你是怎么期望我们知道`sendingSize`的价值是什么.我的回答基于*假设*,即'sendingSize = 307200*3`.从堆栈分配的内存在使用前不会被清除,所以如果你没有设置它,它只是一些随机值. (2认同)