繁体   English   中英

C ++动态分配的2D数组分配内存吗?

[英]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::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].

在AAAA,您有未定义的行为。 从那时起,任何事情都可能发生-而且甚至更有趣。

在标准C ++中,没有“段错误”之类的行为。 实现可以定义一些操作来做到这一点,但是我不知道是否有任何麻烦。 在某些情况下,它只是偶然发生的。

访问其边界之外的数组是未定义的行为 因此,没有理由期望会发生什么特别的事情:它可能崩溃,返回正确的答案,返回错误的答案,在程序的另一部分静默破坏数据,或者是其他所有可能性。

data[1][25] = 20; //Should segfault? AAAAA

如果不允许您访问该位置,则会出现段错误。 C++没有检查,从代码角度来看,您要访问的位置是否有效。

您获得了输出,因为它存储在该位置。 可能是什么。 这是未定义的行为,您可能不会每次都得到相同的结果。

看到这个答案,尽管它谈论的是局部局部变量,但是它给出了很好的示例,说明了如何进行这种数据访问是不确定的行为

datadata[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM