[英]C++ dynamically allocated 2D array overallocate memory?
我开始学习C ++,我想实现一个简单的2D数组并在不使用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].
在AAAA,您有未定义的行为。 从那时起,任何事情都可能发生-而且甚至更有趣。
在标准C ++中,没有“段错误”之类的行为。 实现可以定义一些操作来做到这一点,但是我不知道是否有任何麻烦。 在某些情况下,它只是偶然发生的。
访问其边界之外的数组是未定义的行为 。 因此,没有理由期望会发生什么特别的事情:它可能崩溃,返回正确的答案,返回错误的答案,在程序的另一部分静默破坏数据,或者是其他所有可能性。
data[1][25] = 20; //Should segfault? AAAAA
如果不允许您访问该位置,则会出现段错误。 在C++
没有检查,从代码角度来看,您要访问的位置是否有效。
您获得了输出,因为它存储在该位置。 可能是什么。 这是未定义的行为,您可能不会每次都得到相同的结果。
看到这个答案,尽管它谈论的是局部局部变量,但是它给出了很好的示例,说明了如何进行这种数据访问是不确定的行为
data
和data[0]
都是指针(单或双无关)。 对于每个实现,它们都有定义的大小。 在您的情况下, pointer
的大小是计算机上int
大小的两倍。 因此,输出。 与指向数组的指针(而不是数组,即声明为数组char a[]
等的数组)一起使用时, sizeof
给出指针的大小
data [0]和data都是指针。 指针在32位系统上的大小为4,在64位系统上的大小为8。 因此,m和n相等。 int的大小始终为4。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.