C 动态数组超出内存限制

问题描述 投票:0回答:1

我正在尝试使用内存分配创建一个 3D 数组,并释放它。但是,我的程序似乎超出了内存限制。我该如何优化它?我错过了什么?

函数.h

unsigned*** new_3d_array(unsigned n,unsigned m,unsigned k);
void delete_3d_array(unsigned ***arr);

unsigned*** new_3d_array(unsigned n,unsigned m,unsigned k){
    unsigned*** array = (unsigned***)malloc(n * sizeof(unsigned**));
    for (int i = 0; i < n; i++) {
            array[i] = (unsigned**)malloc(m * sizeof(unsigned*));
            for (int j = 0; j < m; j++) {
                    array[i][j] = (unsigned*)malloc(k * sizeof(unsigned));
            }
    }

    return array;
}

void delete_3d_array(unsigned ***arr){
    unsigned long long int n = sizeof(arr)/sizeof(arr[0]); //Get individual general size
    unsigned long long int m = sizeof(arr[0])/sizeof(arr[0][0]);
    
    for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                 free(arr[i][j]);
            }
            free(arr[i]);
    }
    free(arr);
}

main.c

#include<stdio.h>
#include"function.h"

//Sample Input
//60 100 100 100 7122

unsigned random_seed=7122;
unsigned Random(){
    return random_seed=random_seed*0xdefaced+1;
}
int main(){
    int n,m,k,_;
    scanf("%d%d%d%d%u",&_,&n,&m,&k,&random_seed);
    while(_--){
        unsigned ***arr=new_3d_array(n,m,k);
        int i,j,l;
        for(i=0;i<n;++i){
            for(j=0;j<m;++j){
                for(l=0;l<k;++l){
                    arr[i][j][l]=Random();
                }
            }
        }
        for(i=0;i<5;++i){
            unsigned a,b,c;
            a=Random()%n;
            b=Random()%m;
            c=Random()%k;
            if(i)putchar(' ');
            printf("%u",arr[a][b][c]);
        }
        puts("");
        delete_3d_array(arr);
    }
    return 0;
}


我尝试使用 for 循环来定义它。因为 free 函数只传递 3d 数组作为参数,所以我只能通过除以它来找到大小。

原来我的程序优化不够。

c multidimensional-array dynamic-programming
1个回答
1
投票

首先,我强烈建议放弃指针到指针到指针,而是将其全部分配为快速连续的 3D 数组。 正确分配多维数组

因为 free 函数只传递 3d 数组作为参数,所以我只能通过除以它来找到大小。

不,你不能那样做。任何地方都没有存储有关数组大小的信息,程序员的工作就是跟踪它。

sizeof
主要是一个编译时运算符,因此它不知道某些动态数组有多大。您得到的是 pointers 的大小(以字节为单位)。有关详细信息,请参阅如何查找数组的大小(从指向数组第一个元素的指针)?

所以你需要声明

delete_3d_array
和 3 个尺寸参数。值得注意的是,如果您使用 3D 数组来代替,那么这不会成为问题,那么您只需在一行上
free(array)
即可。

© www.soinside.com 2019 - 2024. All rights reserved.