使用malloc的问题

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

我正在编写一个 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 的函数上产生多个部分,是否可以采用一种能够避免核心转储的技术?预先感谢您

c malloc
1个回答
0
投票

malloc(0)
的结果取决于实现;它可能返回
NULL
或指向不允许取消引用的内存的指针;请参阅零大小 malloc。无论哪种方式,都不允许分配给
v[0][0][0]

您可以将该作业放在条件中以避免这种情况:

if (dim1 != 0 && dim2 != 0 && dim3 != 0) {
    v[0][0][0] = 5.7;
}

或者将元素初始化移到最里面的

for
循环中。如果任何维度为零,则该维度的循环将不会执行,并且分配将被跳过。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.