C++ 动态分配的二维数组过度分配内存?

标签 c++ dynamic-memory-allocation

我开始学习 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::arraystd::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/

相关文章:

c++ - const 内置类型是否在 C++ 中内联?

c++ - 在 Delphi 中使用 SecureZeroMemory

c++ - 在 C++ 中调整动态堆栈分配的大小

c++ - C++中的动态分配和大数据结构

尝试在 C 中释放 3D 数组时崩溃

c++ - 字符串运算符,如 std::string

c++ - QT - 主要小部件 - 堆栈还是堆?

c++ - 在 CGAL 中使用时从 geomview 窗口中删除几何对象

c++ - 如何从 int* 类型的堆分配数组中检索 int[num_elem] 类型的变量?

linux - 关于glibc中malloc实现的问题