【问题标题】:multidimensional array faulting多维数组故障
【发布时间】:2014-04-18 00:53:17
【问题描述】:

所以,我需要生成一个数组,结构体是这样设置的:

struct image
{
    int height, width;
    unsigned char (**data)[3];
};
typedef struct image image_t;

我正在使用一个函数来分配所有位置并将其初始设置为 0 值(它实际使用的三个插槽)

image_t create_new_image(int height, int width)
{
 int i, j;
 image_t ret;
 ret.data = malloc(height + 5);
 for (i = 0; i < height; i++)
     ret.data[i] = malloc(width + 5);
 for (i = 0; i < height; i++)
 {
     for (j = 0; j < width; j++) //hit every node
     {
        ret.data[i][j][0] = 0;
        ret.data[i][j][1] = 0;
        ret.data[i][j][2] = 0;
     }
 }
 ret.height = height;
 ret.width = width;
 check_nulls(ret);
 return ret;
}

GDB 给出以下信息:

Breakpoint 2, create_new_image (height=20, width=21) at ansilib.c:28
28      for (i = 0; i < height; i++)
(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x0000000100001292 in create_new_image (height=20, width=21) at ansilib.c:33
33              ret.data[i][j][1] = 0;
(gdb) p i
$1 = 4
(gdb) p j
$2 = 0
(gdb) p ret.data[0]
$3 = (unsigned char (*)[3]) 0x1001038c0
(gdb) p ret.data[1]
$4 = (unsigned char (*)[3]) 0x1001038e0
(gdb) p ret.data[2]
$5 = (unsigned char (*)[3]) 0x100103900
(gdb) p ret.data[3]
$6 = (unsigned char (*)[3]) 0x100103920
(gdb) p ret.data[4]
$7 = (unsigned char (*)[3]) 0x0
(gdb) p ret.data[5]
$8 = (unsigned char (*)[3]) 0x0

有人可以帮助我了解我做错了什么吗?我对多维运行时分配的数组处理得不多,所以可能只是它的分配方式,但我很无能为力。

【问题讨论】:

    标签: c arrays multidimensional-array malloc


    【解决方案1】:

    您的malloc 呼叫不正确。 malloc 函数需要字节数,而不是对象数(我不知道 + 5 应该表示什么)。

    如果你使用成语ptr = malloc(N * sizeof *ptr),那么事情就变得简单了:

    ret.data = malloc(height * sizeof *ret.data);
    for (i = 0; i < height; i++)
        ret.data[i] = calloc(width, sizeof *ret.data[i]);
    

    那么就我所见,您的其余代码都可以。

    使用calloc 而不是malloc 意味着您不需要循环将所有内容设置为0。对于calloc,论点采用哪种方式都没有关系。

    【讨论】:

      【解决方案2】:
      image_t create_new_image(int height, int width){
          int i, j;
          image_t ret;
          ret.data = malloc(height*sizeof(*ret.data));
          for (i = 0; i < height; i++)
              ret.data[i] = malloc(width*sizeof(**ret.data));
          for (i = 0; i < height; i++){
              for (j = 0; j < width; j++){
                  ret.data[i][j][0] = 0;
                  ret.data[i][j][1] = 0;
                  ret.data[i][j][2] = 0;
              }
          }
          ret.height = height;
          ret.width = width;
          check_nulls(ret);
          return ret;
      }
      

      【讨论】:

        【解决方案3】:

        我猜你想创建 RGB 或 YUB 图像数据。

        问题是这一行:

        ret.data = malloc(height + 5);
        

        因为你声明了

        unsigned char (**data)[3];
        

        您不能将内存分配给 ret.data。它已经分配为 3 元素数组。

        试试

        for(int i=0; i<3; i++) {
             ret.data[i] = malloc() // for height
             for(every line)
                  ret.data[i][j] = malloc() // for width
                  // and set all elements to zero
        }
        

        【讨论】:

        • ret.data 尚未分配。 [3] 是指向的类型的一部分; data是一个未初始化的指针(指向一个指针,指向一个3字节的数组)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-31
        • 1970-01-01
        • 1970-01-01
        • 2019-05-03
        • 1970-01-01
        相关资源
        最近更新 更多