Intereting Posts
Вычисление расстояния с помощью одной камеры UDP WinSock – не прием пакетов широковещания Почему отрицание минимально возможного целого дает? каково рабочее правило этой программы, Объяснение? чтение из последовательного порта в c разрывает линии Временная метка препроцессора Как разрешить статическое объявление следует нестатическая декларация в коде GCC C? Альтернатива вложенному массиву (6 измерений) с интервалами памяти, сохраняющими доступ O (1) Как прочитать стандартный ввод в строковой переменной до EOF в C? несовместимый тип возврата из функции struct – C Необработанные кадры H264 в контейнере mpegts с использованием libavcodec Типы цепочки с фиксированной шириной C99 Возможно ли создать тип данных длиной один бит в C C При остановке цикла при EOF, но печать приводит к новой строке Почему free () устанавливает только 8 первых байтов в ноль?

Ошибка четной сегментации с CC / GCC, но не G ++ (C / SDL2 / Linux)

Опубликованный код копируется непосредственно из примера популярного учебника SDL2, чтобы убедиться, что я не совершил какую-то глупую ошибку. Все, что я сделал с примером, это изменение пути к файлу изображения, о котором идет речь, я изменил тип bool на int, false на 0 и true на 1. Насколько я понимаю, ничего не должно быть на C ++.

Кажется, что все работает независимо от того, что я делаю, но при компиляции с CC / GCC (я полагаю, это действительно та же сделка). Я получаю ошибку сегментации в самом конце, я подозреваю, что в close () я не смог определить , Компиляция с G ++ каким-то образом предотвращает ошибку сегментации.

Разумеется, решение простое, просто используйте G ++, но я очень хотел бы знать, в чем проблема.

main.c:

//Using SDL and standard IO #include  #include  //Screen dimension constants const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; //Starts up SDL and creates window int init(); //Loads media int loadMedia(); //Frees media and shuts down SDL void close(); //The window we'll be rendering to SDL_Window* gWindow = NULL; //The surface contained by the window SDL_Surface* gScreenSurface = NULL; //The image we will load and show on the screen SDL_Surface* gHelloWorld = NULL; int init() { //Initialization flag int success = 1; //Initialize SDL if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) { printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() ); success = 0; } else { //Create window gWindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN ); if( gWindow == NULL ) { printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() ); success = 0; } else { //Get window surface gScreenSurface = SDL_GetWindowSurface( gWindow ); } } return success; } int loadMedia() { //Loading success flag int success = 1; //Load splash image gHelloWorld = SDL_LoadBMP( "hello_world.bmp" ); if( gHelloWorld == NULL ) { printf( "Unable to load image %s! SDL Error: %s\n", "hello_world.bmp", SDL_GetError() ); success = 0; } return success; } void close() { //Deallocate surface SDL_FreeSurface( gHelloWorld ); gHelloWorld = NULL; //Destroy window SDL_DestroyWindow( gWindow ); gWindow = NULL; //Quit SDL subsystems SDL_Quit(); } int main( int argc, char* args[] ) { //Start up SDL and create window if( !init() ) { printf( "Failed to initialize!\n" ); } else { //Load media if( !loadMedia() ) { printf( "Failed to load media!\n" ); } else { //Apply the image SDL_BlitSurface( gHelloWorld, NULL, gScreenSurface, NULL ); //Update the surface SDL_UpdateWindowSurface( gWindow ); //Wait two seconds SDL_Delay( 2000 ); } } //Free resources and close SDL close(); return 0; } 

Я не понимаю, насколько это важно, но, чтобы быть в безопасности, вот стандартный Makefile, который я использую

 #OBJS specifies which files to compile as part of the project OBJS = main.c #CC specifies which compiler we're using CC = cc #COMPILER_FLAGS specifies the additional compilation options we're using # -w suppresses all warnings COMPILER_FLAGS = -Wall -Wextra -pedantic #LINKER_FLAGS specifies the libraries we're linking against LINKER_FLAGS = -lSDL2 #OBJ_NAME specifies the name of our exectuable OBJ_NAME = test #This is the target that compiles our executable all : $(OBJS) $(CC) $(OBJS) $(COMPILER_FLAGS) $(LINKER_FLAGS) -o $(OBJ_NAME) 

Я не получаю никаких ошибок или предупреждений, но неиспользуемые argv и argc.

На данный момент я в тупике, поэтому я спрашиваю здесь.

С наилучшими пожеланиями.

NB: Я должен упомянуть, что независимо от проблемы, это определенно не проблема аппаратного обеспечения, различные результаты поиска предложили, поскольку я получаю точно такой же результат и проблему на двух совершенно разных аппаратных платформах.

Если вы переименуете функцию close() segfault уходит, выглядит как вызовы init() в SDL, который вызывает X11, который вызывает в ваш драйвер, который вызывает функцию close() , но вместо вызова right close() он вызывает ваш вместо этого. В C ++ функции получат имя, искаженное чем-то другим, так что это не проблема.