三维数组的分配

时间:2014-10-11 14:27:05

标签: c multidimensional-array malloc free dynamic-memory-allocation

我尝试编写一个函数来动态分配3维数组但我的程序崩溃了。这是代码:

#include <stdio.h>
#include<stdlib.h>

int*** funcao(int a,int b,int c)
{
    int ***ppp=malloc(a*sizeof(int **));
    int i,j,k;

    for(i;i<a;i++)
    {
        ppp[i]=malloc(b*sizeof(int *));
    }
    for( i=0;i<a;i++)
    {
        for(j=0;j<b;j++)
        {
            ppp[i][j]=malloc( c*sizeof(int));
        }
    }

    for(i=0;i<a;i++)
    {
        for(j=0;j<b;j++)
        {
            for(k=0;k<c;k++)
            {
                ppp[i][j][k]=k*i*j;
            }
        }
    }

    return ppp;

    for( i=0;i<a;i++)
    {
        for( j=0;j<b;j++)
        {
            free(ppp[i][j]);
        }
    }

    for( i=0;i<a;i++)
    {
        free(ppp[i]);
    }

    free(ppp);
}

int main()
{
    int ***ppp=funcao(2,5,7);
}

你知道问题出在哪里吗?是因为我在return语句之后释放了函数中的内存吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

您没有初始化变量i

int i,j,k;

所以循环有未定义的行为

for(i;i<a;i++){
    ppp[i]=malloc(b*sizeof(int *));
}

同样不清楚whar这部分功能是什么

for( i=0;i<a;i++){
    for( j=0;j<b;j++){
        free(ppp[i][j]);
    }}

for( i=0;i<a;i++){
    free(ppp[i]);
}

free(ppp);
}
退货声明后

return ppp;

您应该以适当的方式格式化代码。否则很难读懂它。

答案 1 :(得分:0)

您尚未在此for循环i中初始化变量for(i;i<a;i++){

你正确地释放了分配的内存,但是你只是在错误的地方做了。返回指针后,您应该将其释放到main函数中。

检查此修复代码:

#include <stdio.h>
#include <stdlib.h>

int*** funcao(int a,int b,int c)
{
    int ***ppp = malloc( a * sizeof(int **) );
    int i, j, k;
    // Optimized your memory allocation code
    for(i=0; i < a; i++)
    {
        ppp[i] = malloc( b * sizeof(int *) );
        for(j=0; j < b; j++)
        {
            ppp[i][j] = malloc( c * sizeof(int) );
        }
    }

    for(i=0; i < a; i++)
    {
        for(j=0; j < b; j++)
        {
            for(k=0; k < c; k++)
            {
                ppp[i][j][k]=k+i+j;
                printf("%d\t",ppp[i][j][k]);
            }
            printf("\n");
        }
        printf("\n");
    }
    return ppp;
}

int main()
{
    int ***ppp=funcao(2,5,7);
    int i, j, k;
    int a=2,b=5,c=7;
    //Free the memory
    for( i=0; i < a; i++)
    {
        for( j=0; j < b; j++)
        {
            free(ppp[i][j]);
        }
    }
    for( i=0; i < a; i++)
    {
        free(ppp[i]);
    }
    free(ppp);

    return 0;
}