二维数组内存动态分配问题
本帖最后由 gaohuaid 于 2013-08-28 22:43:28 编辑 在C语言中通过给指向指针的指针动态分配内存,然后把它当成一个二维数组使用。代码如下:
int main()
{
int i, j, **array;
array = (int **)malloc(4 * sizeof(int*));
for(i = 0; i < 4; i++)
{
*(array + i)=(int *)malloc(4 * sizeof(int));
}
for(i = 0 ; i < 4; i++)
{
for(j = 0; j < 4; j++)
array[i][j] = i + j;
}
}
此时我认为可以把array看成是4行4列的二维数组,但这样的代码也是正确的:
初始化代码和前面一段相同
for(i = 0 ; i < 4; i++)
{
for(j = 0; j < 10; j++)
array[i][j] = i + j;
}
可以看到当j<10时照样可以给array赋值,且能正确输出,此时明显array变成了10行10列,
而之前分配内存是只分配了4行4列的空间,求解这是该怎么破? c 二维数组 malloc
[解决办法]
猜想: 那是因为你的越界不足够破坏它底层的栈空间的!
如果你再加大了,就会出现内存出错的问题的!
如果这样的话呢?
for(i = 0 ; i < 10; i++)
{
for(j = 0; j < 10; j++)
array[i][j] = i + j;
}
等下面更好的解释
[解决办法]
仅供参考
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
p=(int **)malloc(4*sizeof(int *));
if (NULL==p) return;
for (i=0;i<4;i++) {
p[i]=(int *)malloc(5*sizeof(int));
if (NULL==p[i]) return;
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
p[i][j]=i*5+j;
}
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
printf(" %2d",p[i][j]);
}
printf("\n");
}
for (i=0;i<4;i++) {
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
[解决办法]
首先,C语言中本身就不检测数组越界的行为,所以你这样写是能够正常运行的。
当数组越界以后会覆盖位置的数据,如果是普通数据或者没有数据,那就不会引起什么问题,但如果覆盖的位置是一个指针,那么当你使用这个指针的时候就会出错。
具体的话可以看看这里,解释的很清楚了,我就不多说了。