编译时出现分段错误。
当我尝试在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;
}
答案 0 :(得分: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
...
这是使用C99的一个名为可变长度数组(VLAs)的功能,其中一个非常数大小的数组(在本例中是一个2D w
乘{{1数组,其中h
和w
在运行时才知道)在堆栈上分配。
在堆栈跟踪中提到函数h
应该引起你的注意 - alloca(3)
函数在堆栈上分配动态的内存量。既然你没有在任何地方明确地调用_alloca
,那么它必须来自于使用VLA。
正如您所提到的,修复是在堆上分配图像数据,而不是在堆栈上分配:
alloc()
答案 1 :(得分: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];
}