LINUX.ORG.RU

Segmentation fault


0

0

привет!
есть такой код:

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#define BUFSZ 256
#define FILE "02.txt"

char* reverse(char* str) {
char* tmp;
int i, len = strlen(str);
for(i = 0; i < len; i++) {
print("%s", str[i]);
}
return tmp;
}

int main() {
int fd, nread;
char buf[BUFSZ + 1];
char* bufch;
fd = open(FILE, O_RDONLY);
read(fd, buf, BUFSZ);
close(fd);

bufch = reverse(buf);
printf("%s\n", bufch);
}

---------

print("%s", str[i]);
проблема в от в этой строчке
компиляция проходит все ок
но после выполнения программы:
ошибка - segmentation fault

может кто-то подскажет, в чем проблема?

anonymous

Посмотри что такое FILE в stdio. PS: За такое убивать надо....

Flogger_d
()

Сегфолт из-за того, что reverse возвращает мусор. Т.е. случайный адрес, по которому пытается залезть printf. Система дает ему по ушам.

Flogger_d
()

неверно неплохо \0 в конце считанной строки поставить, и возвращать из reverse что нить осмысленное

anonymous
()

Значение str[i] используется как адрес, %с было бы логичнее.
Или уж послать цикл и %s,str.
После исправления segmentation fault будет уже дальше :-)

io ★★
()

Ну неужели никто так и заметил ошибки, а?

-int i, len = strlen(str);
-for(i = 0; i < len; i++) {
-print("%s", str[i]);

+int i, len = strlen(str);
+for(i = 0; i < len-1; i++) {
+print("%s", str[i]);

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

KDE 3.2-beta

int i, len = strlen(str);
-for(i = 0; i < len; i++) {
-print("%s", str[i]);

+int i, len = strlen(str);
+for(i = 0; i < len-1; i++) {
+print("%s", str[i]); 

Пипец)))
Имхо print("%s", str[i]) 
..пипец вообще)) все даже круче чем я думал))
%s - это для строк, то бишь для char*, а str[i] - это просто char)))
так что нех))
и возвращает оно хню канечно))
 

nelapsi
()
Ответ на: KDE 3.2-beta от nelapsi

долбаная мозилла))

имхо если в reverse %s заменить на %c то сегфолт действительно переместиться в другое место))

nelapsi
()
Ответ на: комментарий от Cobalt

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

ну не такой у меня большой опыт в этом деле... но ведь это же не смертельно...

что касается FILE - то в библиотеке это имя структуры (типа), но никак не переменной... так зачем же меня убивать то? )))

то что функция возвращает "неосмысленные" данные - тоже не проблема по крайней мере на данный момент...

и даже len - 1 делать то не надо!!

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

не судите строго...

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

Да ладно тебе... я вот регулярно наблюдаю как на тренировках народ, профессионально занимающийся бейсболом, регулярно опускают. Зато у тех появляется злость и желание затоптать обидчика (в идеале - в профессиональном смысле). ;)

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

как дебагить векторы

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

Желаем получить по полной программе  ? ;)

Извольте ;)


#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
^^^^^^^^^^^^^^^^^^^^ сноска 1

#include <string.h>
#define BUFSZ 256
#define FILE "02.txt"
^^^^^^^^^^^^^^^^^^^^^ см. сноску 1
а затем  man fopen до просветления 
hint: попробуй вместо open() возпользоваться fopen() ;)

char* reverse(char* str) {
char* tmp;
^^^^^^^^^^^^^^^^^^ сноска 2
int i, len = strlen(str);
^^^^^^^^^^^^^^^^^^^^^^^^^
где проверка на str == NULL ?
for(i = 0; i < len; i++) {
print("%s", str[i]);
^^^^^^^^^^^^^^^^^^^^^^^^^ считаем что это просто опечатка s/print/printf/g
man 3 printf и изучаем чем char отличается от char*
}
return tmp;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cм. сноску 2 
What does it mean ?? что мы с этим указателем от балды будем делать далее ?
}

int main() {
^^^^^^^^^^^^^^^^ сноска 3
int fd, nread;
char buf[BUFSZ + 1];
char* bufch;
fd = open(FILE, O_RDONLY);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Где проверка результата вызова open() ?
read(fd, buf, BUFSZ);
^^^^^^^^^^^^^^^^^^^^^^^^
аналогично
close(fd);
^^^^^^^^^^^
аналогично

hint: клсс программиста определяется по тому, как он умеет написать обработку ошибок

bufch = reverse(buf);
printf("%s\n", bufch);
^^^^^^^^^^^^^^^^^^^^^
Ах вот что мы с ним делаем ? ;)

см сноску 2

} 
^^^^^^^^ см сноску 3
где return ?

hint2: см что сказал Murr про -Wall

sS ★★★★★
()
Ответ на: как дебагить векторы от sS

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

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

как дебагить векторы

>давайте закроем тему.. перед тем как её закрыть info gdb в области bt

вот сейча пожалуй все ;)

sS ★★★★★
()
Ответ на: как дебагить векторы от sS

кстати,
в моем первом листинге print - опечатка на самом деле... нефига было кому-то уирать со смеху...
потом даже если я подключаю бибилиотеку stdio в которой определен указатель FILE почему я не могу написать так как я написал FILE=...?
на самом деле я в итоге вообще не юзаю эту бибилиотеку (так как нет необходимости пользоваться ее функциями)...

но все равно спасибо за лекцию)

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

Ну да - только почему у тебя претензии к окружающим? Ты приходишь, допустим, в ЖЭК договариваться о ремонте - кран мол на кухне течет... Мастер приходит к тебе домой и - Б*:,*,*! Мужик! У тебя на полу насрато! - Да не! Я ж тебе говорю - кран на кухне починить надо - а где насрато - можно перешагнуть. - Б*:##! Да у тебя из розетки дым идет! - Да забей! Ты кран чини! - П:*#:#"! Да у тебя ж кран не той стороной в руду ввернут! - Да я и сам вижу.

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

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

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

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

как дебагить векторы

>потом даже если я подключаю бибилиотеку stdio в которой определен указатель FILE почему я не могу написать так как я написал FILE=...?

потому что препроцессор это страшная штука, это очень мощное средство
сокращения труда кодописателя но при неумелом использовании оно оборачивается во вред...


самая страшная ошибка это _неявная_ ошибка

поменяем open() на fopen()

FILE* fs_ptr;
fs_ptr = fopen(FILE, "r+");

gcc -E | tail -n25 рекомендую сделать самостоятельно ...


а если ты будешь позволять себе писать такой "код" при работе в команде - это вообще будет беда...





sS ★★★★★
()
Ответ на: как дебагить векторы от sS

да есть в этом правда
спасиба за разъяснения
действительно FILE лучше не юзать
пиятно, когда отвечают спокойно и без поливаний...
всем приятных выходных!:))

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

да не, тему не будем закрывать, лучше давайте подумаем как это организовать если к нам в reverse utf8 придет

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

да не, тему не будем закрывать, лучше давайте подумаем как это организовать если к нам в reverse utf8 придет

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