簡體   English   中英

從C中的多維數組訪問數據時偶發意外output

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM