[英]Occasional unexpected output when accessing data from multidimensional array in C
我有一段代碼將圖像中的字節存儲到結構中存儲的多維數組中。 在將字節分配給數組時,預期數據(0xFF,因為我正在使用純白色圖像進行測試)和數組實際指向的數據在 pixel_array[i][j][k] 匹配。 這是將數據存儲在數組中的代碼片段:
unsigned char pixel[bmp_image->pixel_width];
bmp_image->pixel_array = malloc(bmp_image->width * sizeof(unsigned char));
for (int i = 0; i < bmp_image->width; i++) {
bmp_image->pixel_array[i] = malloc(bmp_image->height * sizeof(unsigned char));
for (int j = 0; j < bmp_image->height; j++) {
bmp_image->pixel_array[i][j] = malloc(bmp_image->pixel_width * sizeof(unsigned char));
fread(pixel, sizeof(pixel), 1, bmp_data);
// Pixel width refers to the size of a pixel in bytes
for (int k = 0; k < bmp_image->pixel_width; k++) {
bmp_image->pixel_array[i][j][k] = pixel[k];
// These two print statements always result in the same data (i.e. both print 0xFF for the white test image)
printf("Expected byte: %x\n", pixel[k]);
printf("Saved byte: %x\n\n", bmp_image->pixel_array[i][j][k]);
}
}
fseek(bmp_data, padding, SEEK_CUR);
}
這是存儲圖像數據的結構:
struct Image {
FILE *image_file;
int width;
int height;
int pixel_width;
int error_code;
unsigned char*** pixel_array;
};
我的問題是,一旦我嘗試使用以下代碼訪問存儲在像素數組中的字符,我就會隨機得到意外的 output(即不是十六進制 FF)
for (int i = 0; i < bmp_image->width; i++) {
for (int j = 0; j < bmp_image->height; j++) {
for (int k = 0; k < bmp_image->pixel_width; k++) {
printf("%x", bmp_image->pixel_array[i][j][k]);
}
}
}
下面可以看到帶有 10x10 白色圖像的 output 的示例(預計只有 ff):
6050a3c051a32053a38054a3e055a34057a3ffffffffffffffffffffffffc04ca3404da3fffffffffffffffffffffffff
fffffffffffffffffffffff204ea3a04ea3ffffffffffffffffffffffffffffffffffffffffffffffff804fa3050a3fff
fffffffffffffffffffffffffffffffffffffffffffffe050a36051a3ffffffffffffffffffffffffffffffffffffffff
ffffffff4052a3c052a3ffffffffffffffffffffffffffffffffffffffffffffffffa053a32054a3fffffffffffffffff
fffffffffffffffffffffffffffffff055a38055a3ffffffffffffffffffffffffffffffffffffffffffffffff6056a3e
056a3ffffffffffffffffffffffffffffffffffffffffffffffffc057a34058a3ffffffffffffffffffffffffffffffff
ffffffffffffffff
隨機數據似乎總是在同一個 position 中,但每次的值都不同。 我假設我遇到了一些錯誤分配指針的問題,但到目前為止,我對可能導致它的原因感到困惑。
看來你分配的memory不夠用。
bmp_image->pixel_array[i] = malloc(bmp_image->height * sizeof(unsigned char));
它為bmp_image->height
分配 memory 而它應該為bmp_image->height
pointers分配資源。 一個有助於避免此類錯誤的好模式是:
x = malloc(sizeof *x);
對於這種情況,它將是:
bmp_image->pixel_array[i] = malloc(bmp_image->height * sizeof(*bmp_image->pixel_array[i]));
我假設bmp_image->pixel_array
在使用前已正確分配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.