多维数组故障

时间:2014-04-18 00:53:17

标签: c arrays multidimensional-array malloc

所以,我需要生成一个数组,结构设置如下:

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

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

3 个答案:

答案 0 :(得分: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意味着您不需要将所有内容设置为0calloc的参数围绕参数的方式并不重要。

答案 1 :(得分:0)

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;
}

答案 2 :(得分:-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
}