LINUX.ORG.RU

Segmentation fault


0

0

Код:

FILE *file = NULL;
file = fopen(«1»,«r»);
fclose(file);

Компилируется, при попытке выполнения получаю:

Segmentation fault

Файл существует.Та же ошибка с любым другим файлом. Разрешения на папку стоят 777. Владелец я.


ОС: Ubuntu Linux 9.1
Язык: C++
Компилятор: g++

fopen тебе NULL вернул - почему и что из этого вышло легко понять самому

П.С. учи лучше лисп - там на NULL проверять не надо

lester ★★★★
()

Уверен? Именно «1»? Напиши после открытия файла printf(«%d\n», file);

//ОС: Ubuntu Linux 9.1 — не 9.1, а 9.10.

vkos ★★
()
Ответ на: комментарий от tzukko



В каком месте сегфолт?
Что возвращают fopen и fclose?




fopen возвращает укасатель, не NULL
сегфолт появляется при попытке прочитать что-либо из файла или закрыть его.

В терминале появляется только строка Segmentation fault, и после этого программа сразу же выгружается из памяти.

W_Seraphim
() автор топика

> file = fopen(«1»,«r»);
file = fopen("./1",«r»);

hmax
()

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

Reset ★★★★★
()
Ответ на: комментарий от mv

Код: fight.cc

#include «fight.h»

int main(int argc, char* argv[])
{
   sconBattle * battle = NULL;
   if(argc>1)
      battle = loadBattleFromTxt(argv[1]);
   return 0;
}

sconBattle * loadBattleFromTxt(char path[255])
{
   printf(«%s\n»,path);
   sconBattle * Battle = NULL;
   FILE *file = NULL;
   printf(«%p\n»,file);
   file = fopen("./1.txt",«r»);
   printf(«%p\n»,file);
   
   if(file!=NULL)
   {
      char *S;
      S = fgets(S,255,file);
      fclose(file);
   }
   else
   {
      printf(«ERROR OCCURED»);
   }
   return Battle;
}



Терминал:

seraphim@seraphim-desktop:/www/srv$ make
g++ -c -o fight.o fight.cc
g++ -o fight fight.o
./fight ./battle/1.txt
./battle/1.txt
(nil)
0x1bba010
make: *** [all] Segmentation fault
seraphim@seraphim-desktop:/www/srv$ gdb fight
GNU gdb (GDB) 7.0-ubuntu
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type «show copying»
and «show warranty» for details.
This GDB was configured as «x86_64-linux-gnu».
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /www/srv/fight...done.
(gdb) r ./battle/1.txt
Starting program: /www/srv/fight ./battle/1.txt
./battle/1.txt
(nil)
0x602010

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff732cd04 in _IO_getline_info () from /lib/libc.so.6
(gdb) bt
#0 0x00007ffff732cd04 in _IO_getline_info () from /lib/libc.so.6
#1 0x00007ffff732bbd9 in fgets () from /lib/libc.so.6
#2 0x00000000004007f2 in loadBattleFromTxt(char*) ()
#3 0x0000000000400764 in main ()
(gdb)

W_Seraphim
() автор топика
Ответ на: комментарий от W_Seraphim

char *S;
S = fgets(S,255,file);

И куда пойдет запись? Где место для чтения? Кто выделил?

anonymous
()
Ответ на: комментарий от W_Seraphim

fgets не предполагает выделение памяти под считываемую строку за тебя.

Love5an
()
Ответ на: комментарий от antony986

ну, лучше быть неадекватом, чем дебилом и деградантом :)

Love5an
()
Ответ на: комментарий от W_Seraphim

ну и чему удивляться?

path - ./battle/1.txt
а в fopen() - ./1.txt, который не существует.

ananas ★★★★★
()

ты хоть бы примитивно что-то делал типа такого:

if((fp=fopen(«myfile»,«r»))==NULL)
{ perror(«ERROR: »); exit(-1); }

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от W_Seraphim

ППЦ

и что ты нам мозги пудришь?
у тебя глюков в других местах навалом и segfault не из-за fclose.
впрочем, тебе всё уже сказали.
добавлю: руки прочь от кодерства. ты не конкурентоспособен...

xydo ★★
()
Ответ на: ППЦ от xydo

> добавлю: руки прочь от кодерства. ты не конкурентоспособен...

ну, сегодня возможно, но ведь он, наверное, только учится?

как же я люблю напыщенных идиотов... посмотрим, что у нас
xydo на форуме пишет... ага, первая же ссылка
http://www.linux.org.ru/jump-message.jsp?msgid=4590732&cid=4591042

kernel threads уже в user space крутятся.


ВОН ИЗ ПРОФЕССИИ!

idle ★★★★★
()
Ответ на: комментарий от xydo

я знаю намного меньше, чем мне хотелось бы,
и предпочел бы ошибаться реже.

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

1. http://www.linux.org.ru/jump-message.jsp?msgid=4573417&cid=4587426
2. http://www.linux.org.ru/jump-message.jsp?msgid=4573417&cid=4597914

idle ★★★★★
()
Ответ на: комментарий от idle

>поразительно, но вы, похоже, вообще не поняли,

о чем я говорил. попробуйте перечитать ваши же

два недавних мессиджа в таком порядке:


я понял о чем вы говорили, только это не оправдывает ход ваших мыслей))

я тоже знаю меньше, чем мне хотелось бы, но когда я описываю проблему, я хотя бы не утаиваю деталей, в которых она и закрыта. при этом ТС не удосужился проверить проблему в том объеме, в котором описал. готов поспорить, что в укороченном варианте (см первый пост) всё бы у него заработало.
более того, я не против того, чтобы начинающие здесь учились уму-разуму.
но человек, дублирующий программе аргумент, захардкоденный в самой программе, при этом программа этот аргумент никак не использует - вобщем, с ним явно что-то не то...
хотя допускаю, что тот кусок кода был вариантом для того, чтобы поймать глюк. но что-то непохоже.

и, да, весьма достойно исправлять ошибку (мою про kernel thread) в теме, к ней не относящейся...

xydo ★★
()
Ответ на: комментарий от xydo

> когда я описываю проблему ...

при этом ТС ...


он сделал много ошибок, свойственным начинающим.

я не против того, чтобы начинающие здесь учились уму-разуму.


тогда помогайте, или молчите. самоутверждаться можно и другими
способами.

и, да, весьма достойно исправлять ошибку (мою про kernel thread)

в теме, к ней не относящейся...



недостойно, и исполнено в неподобающей фотрме. я сделал это
только для того, чтобы вы посмотрелись в зеркало.

ладно, мир ;) удачи.

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.