首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

二维数组内存动态分配有关问题

2013-09-05 
二维数组内存动态分配问题本帖最后由 gaohuaid 于 2013-08-28 22:43:28 编辑在C语言中通过给指向指针的指

二维数组内存动态分配问题
本帖最后由 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语言中本身就不检测数组越界的行为,所以你这样写是能够正常运行的。
当数组越界以后会覆盖位置的数据,如果是普通数据或者没有数据,那就不会引起什么问题,但如果覆盖的位置是一个指针,那么当你使用这个指针的时候就会出错。
具体的话可以看看这里,解释的很清楚了,我就不多说了。

热点排行