2015-11-20 45 views
1

基本上我试图为JPEG文件(使用libjpeg)编码阅读器,但我有一个段错误,我想知道是否有人可以看到我的错误在哪里?我确定它来自malloc但我不知道。我试图通过放置一些printf来进行一些调试,但是绝对没有出现,wtf?用缓冲区读取一个JPEG文件:segfault

感谢您的帮助队友......

的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 
+0

尝试刷新标准输出,使您的(缓冲)调试语句的程序崩溃,例如之前出现'的printf( “COUCOUCOUCOUCOU”); fflush(stdout);' – mhawke

+0

好吧,所以我在代码的开头放了一个“fflush(stdout)”? –

+1

“里尔”函数在哪里? –

回答

2

当您致电lire时,您将H,W和C传递给函数。这些是指针,并且它们没有初始化,因此您在lire处发生崩溃。

*H = cinfo.output_height; 

你需要调用lire功能是这样的:

int H; 
int W; 
int C; 

.... 

lire(fichier, &H, &W, &C); 
+0

哦,我现在明白了! 谢谢Michael!它不再seg段了 –