使用缓冲区读取 JPEG 文件:segfault
Reading a JPEG file with a buffer : segfault
基本上我正在尝试为 JPEG 文件编写 reader 代码(使用 libjpeg),但我有一个段错误,我想知道是否有人可以看到我的错误在哪里?我确定它来自 malloc 但我不知道。我试图通过放置一些 printf 来进行一些调试,但绝对 NONE 出现了,wtf ?
感谢小伙伴们的帮助...
main.c :
#include <stdio.h>
#include <stdlib.h>
#include <jpeglib.h>
#include "fonctions.h"
int main (int argc, char** argv){
int *H;
int *W;
int *C;
printf("COUCOUCOUCOUCOU");
FILE *fichier = NULL;
char car;
fichier = fopen("cara.jpg", "r");
if (fichier == NULL)
printf("Probleme lecture");
lire(fichier, H, W, C);
fclose(fichier);
return 0;
}
lire.c :
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <jpeglib.h>
#include <jerror.h>
unsigned char** lire (FILE* file, int *H, int *W, int *C){
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
int n = 0;
unsigned char** buffer;
printf("SHITSHITSHITSHIT\n");
fflush(stdout);
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo); // Initialisation de la structure
jpeg_stdio_src(&cinfo,file); // file est de type FILE * (descripteur de fichier
// sur le fichier jpega decompresser)
jpeg_read_header(&cinfo,TRUE);// lecture des infos sur l'image jpeg
jpeg_start_decompress(&cinfo);// lancement du processus de decompression
*H = cinfo.output_height;
*W = cinfo.output_width;
*C = cinfo.output_components;
buffer=(unsigned char **)malloc( (*H) *sizeof(unsigned char*) );
while (n < *H)
{
buffer[n] = (unsigned char*) malloc( (*W) * (*C) *sizeof(unsigned char *) );
printf("DEBUG\n");
fflush(stdout);
jpeg_read_scanlines(&cinfo,buffer+n,1); // lecture des n lignes suivantes de l'image
// dans le buffer (de type unsigned char *)
n++;
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
return buffer;
}
我用 :
编译
gcc -c -I/usr/local/include *.c
gcc *.o -o programme -ljpeg
当您调用 lire
时,您将 H、W 和 C 传递给该函数。这些是指针,它们没有被初始化,因此你会在 lire
.
中崩溃
*H = cinfo.output_height;
您需要像这样调用 lire
函数:
int H;
int W;
int C;
....
lire(fichier, &H, &W, &C);
基本上我正在尝试为 JPEG 文件编写 reader 代码(使用 libjpeg),但我有一个段错误,我想知道是否有人可以看到我的错误在哪里?我确定它来自 malloc 但我不知道。我试图通过放置一些 printf 来进行一些调试,但绝对 NONE 出现了,wtf ?
感谢小伙伴们的帮助...
main.c :
#include <stdio.h>
#include <stdlib.h>
#include <jpeglib.h>
#include "fonctions.h"
int main (int argc, char** argv){
int *H;
int *W;
int *C;
printf("COUCOUCOUCOUCOU");
FILE *fichier = NULL;
char car;
fichier = fopen("cara.jpg", "r");
if (fichier == NULL)
printf("Probleme lecture");
lire(fichier, H, W, C);
fclose(fichier);
return 0;
}
lire.c :
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <jpeglib.h>
#include <jerror.h>
unsigned char** lire (FILE* file, int *H, int *W, int *C){
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
int n = 0;
unsigned char** buffer;
printf("SHITSHITSHITSHIT\n");
fflush(stdout);
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo); // Initialisation de la structure
jpeg_stdio_src(&cinfo,file); // file est de type FILE * (descripteur de fichier
// sur le fichier jpega decompresser)
jpeg_read_header(&cinfo,TRUE);// lecture des infos sur l'image jpeg
jpeg_start_decompress(&cinfo);// lancement du processus de decompression
*H = cinfo.output_height;
*W = cinfo.output_width;
*C = cinfo.output_components;
buffer=(unsigned char **)malloc( (*H) *sizeof(unsigned char*) );
while (n < *H)
{
buffer[n] = (unsigned char*) malloc( (*W) * (*C) *sizeof(unsigned char *) );
printf("DEBUG\n");
fflush(stdout);
jpeg_read_scanlines(&cinfo,buffer+n,1); // lecture des n lignes suivantes de l'image
// dans le buffer (de type unsigned char *)
n++;
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
return buffer;
}
我用 :
编译gcc -c -I/usr/local/include *.c
gcc *.o -o programme -ljpeg
当您调用 lire
时,您将 H、W 和 C 传递给该函数。这些是指针,它们没有被初始化,因此你会在 lire
.
*H = cinfo.output_height;
您需要像这样调用 lire
函数:
int H;
int W;
int C;
....
lire(fichier, &H, &W, &C);