gpt4 book ai didi

c - 分配给二维数组的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 03:34:47 26 4
gpt4 key购买 nike

我正在尝试获取一个 bmp 文件并制作一个灰度副本。我正在学习动态分配,我必须动态分配一个二维数组,我将 bmp 文件导入到该数组并从中对其进行操作,因此它可以处理各种图片尺寸。但在接近尾声时(我标记了哪里)我遇到了段错误,我不知道为什么。如果我不动态分配“像素”,一切都会很好。

#include <stdio.h>
#include <stdlib.h>

int main(void) {

const int HEADER_SIZE = 54;

FILE *infile = fopen("test1.bmp", "rb");
FILE *outfile1 = fopen("copy1.bmp", "wb");

int i, width, height, r, c, bmpsize;
char header[HEADER_SIZE], filename[32];
char **pixels; //initialize pixels here

puts("Enter the filename: ");

i = -1;
while(filename[i] != '\n')
{
i++;
scanf("%c", &filename[i]);
}
filename[i] = '.';
filename[i+1] = 'b';
filename[i+2] = 'm';
filename[i+3] = 'p';
filename[i+4] = '\0';

i = -1;
while(filename[i] != '\0')
{
i++;
printf("%c", filename[i]);
}

infile = fopen(filename, "rb");

puts("Enter the height and width (in pixels): ");
scanf("%d%d", &height, &width);

bmpsize = 3 * width * height;

pixels = malloc(height * sizeof(char*)); //DA part 1

for(i = 0; i < height; i++)
{
pixels[i] = malloc((width * 3) * sizeof(char)); //DA part 2
}

fread(header, 1 , HEADER_SIZE, infile);
fread(pixels, 1 , bmpsize, infile);

for( r = 0; r < height; r++) {
for ( c = 0; c < width*3; c += 3) {
int avg= 0;
puts("THIS PUTS PRINTS: THE NEXT LINE IS MY PROBLEM");
avg = ((int) pixels[r][c] + (int) pixels[r][c+1] + (int) pixels[r][c+2]) / 3;//This is my problem line, why?
puts("THIS PUTS DOESN'T PRINT. ERROR: SEG. FAULT(core dumped)");
pixels[r][c] = (char) avg;
pixels[r][c+1] = (char) avg;
pixels[r][c+2] = (char) avg;
}
}

puts("Done. Check the generated images.");

fwrite(header, sizeof(char) , HEADER_SIZE, outfile1);
fwrite(pixels, sizeof(char) , bmpsize, outfile1);

fclose(infile);
fclose(outfile1);
return 0;
}

最佳答案

我认为问题在于您的 fread 调用以及您如何为文件内容设置输入缓冲区

pixels =  malloc(height * sizeof(char*));            //DA part 1

for(i = 0; i < height; i++)
{
pixels[i] = malloc((width * 3) * sizeof(char)); //DA part 2
}

fread(pixels, 1 , bmpsize, infile);

你分配的内存总共bmpsize字节但是pixels的长度只是height字节- 但您将它传递给 fread 就好像它是一个长度为 bmpsize 字节的缓冲区。 pixels 中的每个元素都是一个 char* - 每个元素的地址都是动态分配的数组 block ,但这并不意味着您可以处理您的 pixels 数组作为一个连续的内存块。

因此,这些在您的循环中动态分配的数组未被初始化,这可能会在您稍后在循环中读取它们时导致段错误(读取未初始化的变量是未定义的行为)。

这可能解释了为什么当您使用非动态分配的二维数组时您的代码可以工作——因为这样的二维数组在内存中是连续的。

关于c - 分配给二维数组的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33467571/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com