【问题标题】:C 2D array Memory allocationC 二维数组内存分配
【发布时间】:2010-09-22 02:42:46
【问题描述】:

大家好, 以下分配二维数组的逻辑是否有问题:

unsigned char **
Malloc2D_uchr(int ht, int wt, unsigned char initv)
{
    int h, w;
    unsigned char **x;

    x = (unsigned char **) malloc(sizeof(void *) * ht);
    DEBUG_PRINT_MEMLOC_EXIT(x,"malloc failed (%s,%i)\n",sizeof(void *)*ht);

    x[0] = (unsigned char *) malloc(sizeof(unsigned char) * ht * wt);
    DEBUG_PRINT_MEMLOC_EXIT(x[0],"malloc failed (%s,%i)\n",sizeof(unsigned char)*ht*wt);

    for (h = 1; h < ht; h++)
    {
        x[h] = x[h - 1] + wt; /* + is a pointer summation */
    }
    for (h = 0; h < ht; h++)
    {
        for (w = 0; w < wt; w++)
        {
            x[h][w] = initv;
        }
    }

    return x;



}

宏展开是:

#define DEBUG_PRINT_MEMLOC_EXIT(t,s,z);     if(t == NULL){\
                                                printf(s,__FILE__,__LINE__,z);\
                                                printf("Malloc size = %d\n",z);\
                                                exit(-1);\
                                    }

有时在 malloc() 期间代码会崩溃。

提前致谢。

【问题讨论】:

  • DEBUG_PRINT_MEMLOC_EXIT 是否检查分配错误?
  • 是的,确实如此。我发布了宏扩展。
  • 如果malloc 崩溃了,那么这可能意味着您在之前的某个时间点超出了使用malloc() 分配的块的范围。如果您的平台支持,请使用 valgrind 进行检查。

标签: c memory-management malloc


【解决方案1】:

没有什么根本上的错误——这种方法是完美的。但是,您应该检查乘法是否溢出,并且您的 malloc() 行可以以更简洁的方式编写:

if ((ht > SIZE_MAX / sizeof x[0]) || (wt > (SIZE_MAX / sizeof x[0][0]) / ht))
    /* error, too large */

x = malloc(sizeof x[0] * ht);
x[0] = malloc(sizeof x[0][0] * ht * wt);

【讨论】:

    【解决方案2】:

    我很惊讶它不会一直崩溃。你什么都不退货。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 2014-07-19
      • 2016-06-21
      • 2013-02-10
      • 2015-02-01
      相关资源
      最近更新 更多