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

高手看一下小弟我写的动态分配二维数组对不对

2013-09-25 
高手看一下我写的动态分配二维数组对不对?#include stdio.h#include stdlib.hint main(void){int row

高手看一下我写的动态分配二维数组对不对?


#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int row = 0; //行
int column = 0;//列
int **p = NULL; //指向二维数组中每个元素
int i = 0;
int j = 0;
int count = 1;
printf("输入矩阵的行和列:");
scanf("%d%d",&row,&column);

p = (int**)malloc(sizeof(int*) * row * column);//p指向row*column个一位数组地址

for(i = 0; i < row; i++)
{
p[i] = (int*)malloc(sizeof(int) * column);//p[i]是每一个一位数组,它指向column个整形变量
}

//给动态分配的二维数组赋值
for(i = 0;i < row;i ++)
{
for(j = 0; j < column; j++)
{
*(*(p+i)+j) = count++;
}
}
//打印二维数组
for(i = 0; i < row; i++)
{
for(j = 0; j < column; j++)
{
printf("%3d ",*(*(p+i)+j));
}
putchar('\n');
}
//释放内存
for(i = 0; i < row; i++)
{
free(p[i]);
}
free(p);

return 0;
}


我运行的时候,貌似没有错。
请高手大牛们看看,有没有不对的地方? 二维数组 malloc 内存 动态分配
[解决办法]
//在堆中开辟一个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


[解决办法]
//在堆中开辟一个3×4×5的3维int数组
#include <stdio.h>
#include <malloc.h>
int ***p;
int i,j,k;
void main() {
    p=(int ***)malloc(3*sizeof(int **));
    if (NULL==p) return;
    for (i=0;i<3;i++) {
        p[i]=(int **)malloc(4*sizeof(int *));
        if (NULL==p[i]) return;
        for (j=0;j<4;j++) {
            p[i][j]=(int *)malloc(5*sizeof(int));
            if (NULL==p[i][j]) return;
        }
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            for (k=0;k<5;k++) {
                p[i][j][k]=i*20+j*5+k;
            }
        }
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            for (k=0;k<5;k++) {
                printf(" %2d",p[i][j][k]);
            }
            printf("\n");


        }
        printf("---------------\n");
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            free(p[i][j]);
        }
        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
//---------------
// 20 21 22 23 24
// 25 26 27 28 29
// 30 31 32 33 34
// 35 36 37 38 39
//---------------
// 40 41 42 43 44
// 45 46 47 48 49
// 50 51 52 53 54
// 55 56 57 58 59
//---------------


[解决办法]
p = (int**)malloc(sizeof(int*) * row * column);//p指向row*column个一位数组地址
这里的 分配多了 
只需要
p = (int**)malloc(sizeof(int*) * row);
就可以了 
[解决办法]
不对!
二维分配两次,一次row大小一次column大小就好了!
你的第一次分配多了!
好好理解下二维数组的地址,大小这些基础问题

热点排行