我开始学习 C++,我想实现一个简单的二维数组并在不使用 std::vector
的情况下获取它的大小。但是我在第二个维度上遇到了奇怪的错误:
int **data= new int*[2];
for (int i = 0; i<2;i++){
data[i] = new int[3];
}
data[0][0] = 1;
data[0][1] = 2;
data[0][2] = 3;
data[1][0] = 4;
data[1][1] = 5;
data[1][2] = 6;
data[1][25] = 20; //Should segfault? AAAAA
cout << "Data[1][25] = " << data[1][25] << endl; //Should segfault, no?
int n = sizeof(data[0]) / sizeof(int);
int m = sizeof(data) / sizeof(int);
cout << "M is " << m << " N is " << n << endl;// Reports m = 2, n =2?!?!? BBBB
在 AAAA
我应该遇到段错误,不是吗?相反,我可以分配一个值,然后再读取它。 data[1][any]
的值为零,就像它已被初始化一样。这只是第二个维度的问题,第一个维度的行为符合预期。
稍后在 BBBB
我没有得到 n
的准确尺寸。我做错了什么吗?
最佳答案
C++ 不对数组进行边界检查。访问数组边界之外的数据是未定义的行为,任何事情都有可能发生。它可能会导致段错误,但也可能不会。如果您在数组之前或之后有有效的内存区域,您最终可以访问或修改该内存。这可能会导致程序使用的其他数据损坏。
此外,您对 sizeof
的使用也不正确。 sizeof
是一个编译时 结构。它不能用于在运行时通过指针值确定数组的大小。如果您需要那种类型的功能,请使用 std::array
或 std::vector
。
char somearray[10];
int size = sizeof(somearray); // result is 10. Yay it works.
char *somearrayptr = new char[10];
int size = sizeof(somearrayptr); // size = the size of char* not char[10].
关于C++ 动态分配的二维数组过度分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17277460/