所以,我需要生成一个数组,结构设置如下:
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
有人可以帮我理解我做错了什么吗?我没有处理多维运行时分配的数组,所以它可能只是它的分配方式,但我很无能。
答案 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
意味着您不需要将所有内容设置为0
。 calloc
的参数围绕参数的方式并不重要。
答案 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
}