0

コンパイル時にセグメンテーション違反が発生します。

main() でテーブル配列にデータを入力しようとすると、最初の for ループでのメモリ割り当てと何か関係があると思いますか?

小さいファイルを呼び出すと機能しますが、「大きい」table.bmp ファイルでは機能しません。

私はなぜなのか理解していない?(私はこれにかなり慣れていません)

どんな助けでも大歓迎です。

前もって感謝します

#include <stdio.h>
#include <string.h>
#include <malloc.h>

unsigned char *read_bmp(char *fname,int* _w, int* _h)
{
    unsigned char head[54];
    FILE *f = fopen(fname,"rb");

    // BMP header is 54 bytes
    fread(head, 1, 54, f);

int w = head[18] + ( ((int)head[19]) << 8) + ( ((int)head[20]) << 16) + ( ((int)head[21]) << 24);
int h = head[22] + ( ((int)head[23]) << 8) + ( ((int)head[24]) << 16) + ( ((int)head[25]) << 24);

// lines are aligned on 4-byte boundary
int lineSize = (w / 8 + (w / 8) % 4);
int fileSize = lineSize * h;

unsigned char *img = malloc(w * h), *data = malloc(fileSize);

// skip the header
fseek(f,54,SEEK_SET);

// skip palette - two rgb quads, 8 bytes
fseek(f, 8, SEEK_CUR);

// read data
fread(data,1,fileSize,f);



// decode bits
int i, j, k, rev_j;
for(j = 0, rev_j = h - 1; j < h ; j++, rev_j--) {
    for(i = 0 ; i < w / 8; i++) {
        int fpos = j * lineSize + i, pos = rev_j * w + i * 8;
        for(k = 0 ; k < 8 ; k++)
            img[pos + (7 - k)] = (data[fpos] >> k ) & 1;
    }`enter code here`
}

free(data);
*_w = w; *_h = h;
return img;
}

int main()
{

int w, h, i, j, x, y, b=0, butpos=0;

//Get array data

unsigned char* imgtable = read_bmp("table.bmp", &w, &h);
int table[w][h];

printf("w=%i \n", w);
printf("h=%i \n", h);

//make table array

 for(j = 0 ; j < h ; j++)
{

    for(i = 0 ; i < w ; i++)
        table[j][i] = imgtable[j * w + i] ? 0 : 1;

}
4

2 に答える 2

1

スタックに画像データを割り当てようとしています。画像が大きすぎると、スタック オーバーフローが発生します。このコードが問題です:

int main()
{

    int w, h, i, j, x, y, b=0, butpos=0;

    //Get array data

    unsigned char* imgtable = read_bmp("table.bmp", &w, &h);
    int table[w][h];  // <-- HERE
    ...

これは可変長配列(VLA)と呼ばれる C99 の機能を使用しており、一定でないサイズの配列 (この場合は 2D wbyh配列で、whは実行時まで不明) がスタックに割り当てられます。

スタック トレースでの関数の言及は、_allocaこれを示しているはずです。関数は、スタックalloca(3)に動的な量のメモリを割り当てます。また、自分で明示的に呼び出しているわけではないalloc()ので、VLA の使用から来ているに違いありません。

あなたが述べたように、修正はスタックではなくヒープに画像データを割り当てることです:

data = malloc(h * w * sizeof(*data));
table = malloc(h * sizeof(*table));
for (i = 0; i < h; i++)
{
    table[i] = &data[i * w];
}

...

free(table);
free(data);
于 2013-04-16T23:23:14.823 に答える
0

誰かが同様の問題を抱えている場合、メモリ割り当てに問題があるようです。

以下の次の解決策がうまくいきました。

unsigned char* img = read_table("table.bmp", &w, &h); 
int *data;
int **table;   

data = malloc(h * w * sizeof(*data));
table = malloc(h * sizeof(*table));
for (i = 0; i < h; ++i)
{
    table[i] = &data[i * w];
}   
于 2013-04-16T22:18:51.380 に答える