0

我真的很难找到这里有什么问题。请帮忙。

我主要声明(宽度和长度已知):

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

但没有运气。先感谢您。

4

1 回答 1

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_imageshort**,它只是指向指针的指针,而不是具有声明宽度的二维数组。所以它要求参数是一个指针数组。

从 C99 开始,您还可以这样做:

void print_image_array(short the_image[image_length][image_width], int image_width, int image_length);

此函数声明将与上述数组声明兼容,但与我在代码中初始化的指针数组不兼容。您必须选择一种方式,并确保函数和调用者同意。

于 2013-06-27T23:14:55.840 回答