我正在编写一个 C 代码,其中需要动态分配多个维度(例如 3)的数组。 一个最小的例子可以是(根据一些程序员兄弟的建议,我报告了一个完整的最小示例来检查 malloc 报告)
#include <stdio.h>
#include <stdlib.h>
int main()
{
double ***v;
int dim1=10;
int dim2=0;
int dim3=7;
v = (double ***) malloc_chk(sizeof(double **)*dim1,__FILE__,__LINE__);
for(int i=0; i<dim1; i++)
{
v[i] = (double **) malloc_chk(sizeof(double *)*dim2,__FILE__,__LINE__);
for(int j=0; j<dim2; j++)
{
v[i][j] = (double *) malloc_chk(sizeof(double) * dim3,__FILE__,__LINE__);
}
}
v[0][0][0] = 5.7; // Segmentation fault
return 0;
}
void *malloc_chk(size_t size, char *funcName, int line)
{
void *ptr;
ptr = malloc(size);
if(ptr == NULL)
{
printf("Memory allocation faild.\n");
printf("Memory size reqeusted: %zu\n",size);
printf("Function name where the error occurs %s\n",funcName);
printf("Line of the source code where the error occurs: %d\n",line);
printf("Execution aborted @malloc_chk\n");
exit(1);
}
else
return ptr;
}
有时,dim_i 可能为 0,并且使用 v 运行代码会产生代码转储。目前我的解决方法是验证 dim_i 是否为空并增加到 1。显然,此解决方案在 dim_i 必须为 0 才能获得正确解决方案的部分中出现了很多问题。我的问题是:为了保持代码的通用性并且不会在一个或多个 dim_i null 的函数上产生多个部分,是否可以采用一种能够避免核心转储的技术?预先感谢您
malloc(0)
的结果取决于实现;它可能返回 NULL
或指向不允许取消引用的内存的指针;请参阅零大小 malloc。无论哪种方式,都不允许分配给 v[0][0][0]
。
您可以将该作业放在条件中以避免这种情况:
if (dim1 != 0 && dim2 != 0 && dim3 != 0) {
v[0][0][0] = 5.7;
}
或者将元素初始化移到最里面的
for
循环中。如果任何维度为零,则该维度的循环将不会执行,并且分配将被跳过。