为啥在编译我的代码C(linux)时出现分段错误(核心转储)[关闭]

Posted

技术标签:

【中文标题】为啥在编译我的代码C(linux)时出现分段错误(核心转储)[关闭]【英文标题】:why get I segmentation fault (core dumped) on compiling my code C (linux) [closed]为什么在编译我的代码C(linux)时出现分段错误(核心转储)[关闭] 【发布时间】:2014-03-18 15:53:47 【问题描述】:

这是我的代码。 谁能帮帮我?

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


int blit_image(char chemin[15],SDL_Surface *fenetre,int posx,int posy) 
    SDL_Surface *temp;
    SDL_Surface *image; 
    SDL_Rect position;

    temp = SDL_LoadBMP(chemin);

    image= SDL_DisplayFormat(temp);
    position.x = posx;
    position.y = posy; 
    position.w = image->w; 
    position.h = image->h;

    SDL_BlitSurface(image,NULL,fenetre,&position); SDL_Flip(fenetre);
    SDL_FreeSurface(temp); 
    SDL_FreeSurface(image); 


int main(int argc, char *argv[])  
    SDL_Surface *fenetre; 
    SDL_Event event; int done=1; SDL_Init(SDL_INIT_VIDEO);

    fenetre = SDL_SetVideoMode(910,600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    blit_image("resources/images/fondblanc.bmp",fenetre,0,0); 
    blit_image("resources/images/chat.bmp",fenetre,0,0);//cat 
    blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25);//dog
    blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140); //horse
    blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255); //tiger
    blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370);//hen
    blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);
    while (done) 

        SDL_WaitEvent(&event); 
        switch(event.type) 
        case SDL_QUIT: 
            
                done=0;
                break; 
            
        case SDL_MOUSEBUTTONDOWN:
            
                if ((event.button.x>820)&&(event.button.x<890)&&(event.button.y<115)&&                                                     (event.button.y>25)) 
                 
                    blit_image("resources/images/chat.bmp",fenetre,0,0); 
                
                if ((event.button.x>820)&&(event.button.x<890)&&(event.button.y<230)&&         (event.button.y>140))
                 
                    blit_image("resources/images/chien.bmp",fenetre,0,0); 
                 
                if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<345)&&(event.motion.y>255))
                 
                    blit_image("resources/images/cheval.bmp",fenetre,0,0);
                
                if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<460)&&         (event.motion.y>370))
                
                    blit_image("resources/images/tigre.bmp",fenetre,0,0); 
                
                if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<575)&&(event.motion.y>485))
                
                    blit_image("resources/images/poule.bmp",fenetre,0,0);
                 
            

        

        if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<115)&&         (event.motion.y>25)) 
        
            blit_image("resources/bouttons/chatbtClic.bmp",fenetre,820,25);
            blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140); 
            blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255); 
            blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370);
            blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);
        
        if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<230)&&(event.motion.y>140))
        
            blit_image("resources/bouttons/chienbtClic.bmp",fenetre,820,140); 
            blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25);
            blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255);
            blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370);
            blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);

        
        if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<345)&&         (event.motion.y>255)) 
        
            blit_image("resources/bouttons/chevalbtClic.bmp",fenetre,820,255);
            blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25); 
            blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140); 
            blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370); 
            blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);

        

        if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<460)&&(event.motion.y>370))  
            blit_image("resources/bouttons/tigrebtClic.bmp",fenetre,820,370);

            blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25);
            blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140);
            blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255);

            blit_image("resources/bouttons/poulebt.bmp",fenetre,820,485);
         
        if ((event.motion.x>820)&&(event.motion.x<890)&&(event.motion.y<575)&&(event.motion.y>485)) 
        
            blit_image("resources/bouttons/poulebtClic.bmp",fenetre,820,485);

            blit_image("resources/bouttons/chatbt.bmp",fenetre,820,25);
            blit_image("resources/bouttons/chienbt.bmp",fenetre,820,140); 
            blit_image("resources/bouttons/chevalbt.bmp",fenetre,820,255);
            blit_image("resources/bouttons/tigrebt.bmp",fenetre,820,370);

        
     

    SDL_Quit(); 

    return 0; 

我使用gcc game.c -o prog -lSDL -lSDL_mixer -lSDL_ttf编译它

代码编译成功,但在输入 ./prog 以执行代码时它显示给我 "Segmentation fault (core dumped)"

但使用的文件存在于目录中

【问题讨论】:

在像 gdb 这样的调试器中运行程序,看看它在哪里崩溃 "Segmentation fault (core dumped)" 不是编译器错误(除非您发现编译器错误,这不太可能)。相反,您更有可能遇到 run time 错误。描述您的确切步骤。你编译代码了吗?你链接代码了吗?你运行代码了吗?您究竟是从哪里得到错误的,您是如何尝试调试的? 我使用 gcc game.c -o prog -lSDL -lSDL_mixer -lSDL_ttf 编译它 @sanaEsprit:编译的结果是什么?*你收到错误了吗?还是编译成功?你接下来做了什么? (您必须提供信息,否则我们无能为力) VTC: “请说明您的具体问题或添加其他详细信息以准确突出您的需要。” 【参考方案1】:

您的代码中的许多问题之一是:

int blit_image(char chemin[15],SDL_Surface *fenetre,int posx,int posy)

    [...]

该函数被声明为返回int

您在该函数中看到return 语句吗? 它如何在没有返回语句的情况下返回int

您的 main 函数被声明为返回一个 int,而且令人惊讶的是,它以 return 0; 结尾。 你是如何在main 中得到它的,而不是在你的其他函数中?

【讨论】:

虽然这绝对是一个应该解决的问题,但无论如何都不会捕获来自 blit_image() 的返回值这一事实减轻了这种特殊的疏忽,并使其不太可能成为分段的原因故障...【参考方案2】:

你声明了函数:

int blit_image(char chemin[15],SDL_Surface *fenetre,int posx,int posy) 

所以参数 #1 有 15 个字符。

但是当你调用它时,你调用它:

 blit_image("resources/images/fondblanc.bmp",fenetre,0,0); 

据我计算,该文件名有 31 个字符,不适合 15 个字符。

我还在您的代码中添加了一些 printf 语句,这将帮助您找出崩溃的位置。 您应该继续添加更多 printf 语句,直到缩小崩溃范围。

【讨论】:

没有 printf 调试。使用 gdb 和 valgrind 等真正的工具。 我将 15 替换为 50,然后我重新编译了代码,现在它显示我 temp is NULL Segmentation fault (core dumped) 所以问题一定出在 url 中?:( 如果SDL_LoadBMP(chemin);返回NULL,你应该阅读文档,仔细检查路径,然后调查 谢谢@abelenky,它现在可以工作了=)

以上是关于为啥在编译我的代码C(linux)时出现分段错误(核心转储)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

运行 C++ 代码时出现分段错误

exe C时出现分段错误错误

在Linux机器上运行C代码时出现分段错误(核心转储)[关闭]

请解释为啥这个 C 代码给我一个分段错误?

从 C 调用汇编函数时出现分段错误错误

在C中调用fgets时出现分段错误