我正在运行以下代码,其中我声明了一个动态2D数组,然后继续为列索引分配高于实际为动态数组分配的数字列的值。但是,当我这样做时,代码运行完美,我不会收到错误,我相信我应该得到错误。
void main(){
unsigned char **bitarray = NULL;
bitarray = new unsigned char*[96];
for (int j = 0; j < 96; j++)
{
bitarray[j] = new unsigned char[56];
if (bitarray[j] == NULL)
{
cout << "Memory could not be allocated for 2D Array.";
return;// return if memory not allocated
}
}
bitarray[0][64] = '1';
bitarray[10][64] = '1';
cout << bitarray[0][64] << " " << bitarray[10][64];
getch();
return;
}
The link to the output I get is here(这些值实际上是准确分配的,但不知道为什么)。
答案 0 :(得分:5)
在C ++中,从边界中访问缓冲区会调用未定义的行为(不是预期的陷阱错误)。
C ++规范将术语未定义行为定义为:
本国际标准强加无要求的行为。
答案 1 :(得分:4)
在您的代码中,两者
bitarray[0][64] = '1';
bitarray[10][64] = '1';
正在访问超出范围的内存。即,那些存储位置是“无效的”。访问无效内存会调用undefined behaviour。
访问冲突错误或分段错误是UB的许多可能结果之一。没有任何保证。
来自wiki page for segmentation fault,
在使用硬件内存分段来提供虚拟内存的系统上,当硬件检测到尝试引用不存在的段或引用段的边界之外的位置时,会发生分段错误....
所以,也许,只是可能,bitarray[0][64]
的内存区域位于已分配的页面(段)内,该页面可被程序访问(但无论如何都是无效的),在此非常特别案件。这并不意味着它永远都是。
尽管如此,void main()
不是main()
函数的正确签名。 C++11
的推荐(main()
,§3.6.1)签名为int main(void)
。
答案 2 :(得分:3)
C ++ 11引入了std::array,方法at()
提供了越界检查。