LINUX.ORG.RU

Програмка из учебника дает Segmentation fault


0

0

Вот пример из самоучителя Шилдта по С++.

Программа должна выполнять перестановку символов в строке.

Компилю с gcc. И получаю после отработки "Segmentation fault".

Не подскажите ли в чем дело?

Заранее благодарен за помощь.

#include <iostream>

#include <cstring>

using namespace std;

void reverse(char *str, int count = 0);

int main()

{

char *s1 = "Это проверка";

char *s2 = "Мне нравится C++";

reverse(s1); // Реверс всей строки

reverse(s2, 7); //Реверс первых семи знаков

cout << s1 << '\n';

cout << s2 << '\n';

return 0; }

void reverse(char *str, int count)

{ int i, j;

char temp;

if(!count) count = strlen(str) - 1;

for(i=0, j=count; i<j; i++, j--) {

temp = str[ i ];

str[ i ] = str[ j ];

str[ j ] = temp;

}

}

anonymous

Ээээээ. А как бы каким образом константные строки ты хочешь поменять?

Во-первых, объявляются фактически const char *

Во-вторых, чтобы работало, нужно объявлять как char [].

RTFM! Если у этого Шилдта такая лажа в книге, то он глубоко не прав.
Помню его книгу по обычному си, там лажи вроде не было.
Может там все-таки char [], а не char * ?

anonymous
()

"str1" - транслируется в данные которые находятся в readonly сегменте

поэтому любые операции записи в туда будут отсасывать

lg ★★
()

У Шилдта нет (хотя он ориентировался на Borland, что не есть 100% правильно) - а вот насчет переводчиков ситуация аховая. Помню книгу Кристриансена по Perl - приходилось сверять код с оригиналом, нарытом в сети - в нашем издании было такое количество опечаток, что треть примеров (ну, может поменьше, но не намного) были изначально неработоспособны...

gennik
()

Ты если инишь как char* то допиши mutable, хоть есть смысл этого для классав но тоже пойдет, а лучьше char[], это означает что ни прикаких раскладах НЕ константа

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

> книгу Кристриансена по Perl

Которую, если не секрет? Уж не Cookbook ли?

P.S. И что переводчики могли делать с кодом, кроме перевода комментариев?

anonymous
()

Да, ошибся, не переводчики, а наборщики - но от этого не легче. И именно она - причем было по-моему 2 идания, во втором часть опечаток отловили. Бвла еще книга "Perl и CGI" - красненькая, такая :) - там даже на компакте часть примеров была набрана с ошибками в коде.

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

>а если с -g откомпилить и под gdb запустить то все OK!!! А кто ж знает как gdb память для процесса выделяет?!?! Но, повидимому не так как операционка. Поэтому все и ОК! (Но то что будет ОК в следующий раз никакие стандарты не гарантируют :-))

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