我正在尝试使用内存分配创建一个 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 数组作为参数,所以我只能通过除以它来找到大小。
原来我的程序优化不够。
首先,我强烈建议放弃指针到指针到指针,而是将其全部分配为快速连续的 3D 数组。 正确分配多维数组
因为 free 函数只传递 3d 数组作为参数,所以我只能通过除以它来找到大小。
不,你不能那样做。任何地方都没有存储有关数组大小的信息,程序员的工作就是跟踪它。
sizeof
主要是一个编译时运算符,因此它不知道某些动态数组有多大。您得到的是 pointers 的大小(以字节为单位)。有关详细信息,请参阅如何查找数组的大小(从指向数组第一个元素的指针)?。
所以你需要声明
delete_3d_array
和 3 个尺寸参数。值得注意的是,如果您使用 3D 数组来代替,那么这不会成为问题,那么您只需在一行上free(array)
即可。