我真的很难找到这里的错误。请帮忙。
在main中,我声明(宽度和长度已知):
short** the_image;
print_image_array(the_image,image_width,image_length);
,其中
print_image_array(the_image, image_width, image_length)
short** the_image;
long image_width, image_length;
{
int i, j;
for (i=0; i < image_length; i++) {
for (j=0; j < image_width; j++)
printf("%d ", the_image[i][j]);
printf("\n");
}
}
从valgrind,我收到消息:
==2423== at 0x80490D2: print_image_array
==2423== by 0x80491F3: main
==2423== Uninitialised value was created by a stack allocation
==2423== at 0x804911E: main
==2423==
==2423== Invalid read of size 2
==2423== at 0x80490DB: print_image_array
==2423== by 0x80491F3: main
==2423== Address 0x1e5ec381 is not stack'd, malloc'd or (recently) free'd
为什么图像未初始化?我也试过宣布
short the_image[length][width];
但没有运气。提前谢谢。
答案 0 :(得分:1)
在调用print_image_array()
之前,您需要初始化数组:
the_image = malloc(image_length * sizeof(short*));
for (int i = 0; i < image_length; i++) {
the_image[i] = malloc(image_width * sizeof(short));
}
如果你想打印一些合理的东西,你还需要用实际值填充它。否则,你只会得到堆中的随机垃圾。
您无法使用
分配数组short the_image[image_length][image_width]
因为数组在C中没有带有它们的维度。print_image_array()
将the_image
声明为short**
,它只是一个指向指针的指针,而不是一个二维数组声明的宽度。所以它要求参数是一个指针数组。
从C99开始,你也可以这样做:
void print_image_array(short the_image[image_length][image_width], int image_width, int image_length);
此函数声明与上面的数组声明兼容,但它与我在代码中初始化的指针数组不兼容。你必须选择一种方式,并确保函数和调用者同意。