无C函数崩溃

无C函数崩溃,c,memory-management,free,allocation,C,Memory Management,Free,Allocation,我试着检查了地址,一切看起来都正常,打印工作和其他一切都正常。 但是当它试图释放内存时,程序崩溃了。 代码: #包括 #包括 #定义第一个尺寸2 #定义第二个尺寸3 #定义第三个维度2 #定义总数12 无效getNums(浮动*pArr); 无效排序(浮动*帕尔); 无效打印阵列(浮动*帕尔); 内部主(空) { //变量赋值 无符号整数i=0,j=0; 浮点***pppArr=NULL; //内存分配 pppArr=(浮动***)calloc(第一个维度,大小为(浮动**)); 如果(!(pp

我试着检查了地址,一切看起来都正常,打印工作和其他一切都正常。 但是当它试图释放内存时,程序崩溃了。 代码:

#包括
#包括
#定义第一个尺寸2
#定义第二个尺寸3
#定义第三个维度2
#定义总数12
无效getNums(浮动*pArr);
无效排序(浮动*帕尔);
无效打印阵列(浮动*帕尔);
内部主(空)
{
//变量赋值
无符号整数i=0,j=0;
浮点***pppArr=NULL;
//内存分配
pppArr=(浮动***)calloc(第一个维度,大小为(浮动**));
如果(!(pppArr))
{
printf(“分配内存失败..\n”);
系统(“暂停”);
返回1;
}
对于(i=0;i*(pArr+j+1))
{
温度=*(帕尔+j);
*(pArr+j)=*(pArr+j+1);
*(pArr+j+1)=温度;
}
}
}
}

是否缺少某些内容?

当使用指针和动态分配时,分配的内存很可能不是连续的,但每次分配都会有单独的内存区域。这意味着,当您在函数中将其视为一个大的连续内存区域时,您会表现出未定义的行为

实际数组,如

float arr[FIRST_DIM][SECOND_DIM][THIRD_DIM];
现在这将是连续的


例如,有关数组数组和指向指针的指针之间差异的更“图形化”的解释,请参见。

此代码严重超出了索引范围。为
pppArr
分配的内存有三个间接级别。它不是多维数组(即,不是数组数组),而是指向指向指针数组的指针数组。三个间接层次。有6个独立的
float
片,每个片有2个连续元素(即
THIRD_DIM

调用
getNums
sortArr
printArr
时,您正在传递
**pppArr
。这相当于传递
pppArr[0][0]
,它指向
float
值的单个2元素序列。这些功能只能访问第三维度,即2。相反,他们试图访问12个元素(即,
TOTAL
),这当然会破坏内存并导致未定义的行为


据我所知,看起来您正试图以单个一维阵列的形式访问存储。如果是这样的话,那么最简单的修复方法就是消除两级间接寻址,去掉
第一级DIM
第二级DIM
第三级DIM
,只需分配一个带有
长度
元素的平面数组。指针的类型应该是
float*

哦,不,是三星级程序员。您知道例如
*(pppArr+i)
pppArr[i]
相同吗?许多人发现后者更容易阅读和理解(也少写几个字符)。解释@Downvoter的评论。它可以被阅读(至少我是这么做的)作为重构代码以使其更简单的建议。阅读
*(*(pppArr+I)+j)
,而不是以同等的、更正常的方式来编写它,真的很痛苦:
pppArr[I][j]
。这是一个“与语言斗争”的例子。
TOTAL
-->
THIRD\u DIM
getNums
sortArr
printArr
中。有没有办法使其连续并在堆中分配?@Administrator将其分配为一个大块,并使用指针算法通过索引访问它。(例如,
pArr[i*ROWS+j]
,但根据您的具体需要进行了更新)。
float arr[FIRST_DIM][SECOND_DIM][THIRD_DIM];