Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив char и указатель 
V
    Опции темы
Maka6er
  Дата 14.11.2007, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 27.2.2007
Где: Киев

Репутация: нет
Всего: 3



Есть код:
Код

#include "stdafx.h"
#include <iostream>
using namespace std;

char* reverse(char* pChar) 
{    
    int i,j;
    char buff;
    char* reversed = pChar;

    j=0;
    i=0;

    while (*reversed) {
        reversed++;
        j++;
    }

    reversed-=j;
    j--;
    
    while (i<j) {
        buff = reversed[i];
        reversed[i] = reversed[j];
        reversed[j] = buff;
        i++;
        j--;
    }

    return reversed;
}

int _tmain(int argc, _TCHAR* argv[])
{
    char ch[] = "Hello";
    char* y = "Hello";
    char* x;

    x = ch;

    cout << reverse(ch) << endl;  // Здесь все нормально
    cout << reverse(y) << endl;   // Здесь ошибка
    cout << reverse(x) << endl;   // Здесь все нормально

    system("PAUSE");
    return 0;
}


Пожалуйста объясните почему не работает 2-й вариант и как это исправить.
PM MAIL   Вверх
zkv
Дата 14.11.2007, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Maka6er @  14.11.2007,  01:41 Найти цитируемый пост)
Пожалуйста объясните почему не работает 2-й вариант

в первом случае работаешь с массивом символов, во втором со строковым литералом.
Цитата(Maka6er @  14.11.2007,  01:41 Найти цитируемый пост)
и как это исправить. 

Страуструпа почитать
вроде его цитата:
Цитата

Строковым литералом называется последовательность символов, заключенная в двойные
кавычки :
"Это строка"
В строковом литерале на один символ больше,чем используется при записи; он всегда заканчивается нулевым символом '\0',значение которого равно 0.Например :
sizeof("Бор") == 4
Тип строкового литерала есть "массив с надлежащим количеством константных символов";таким образом "Бор" принадлежит типу const
char[4].Строковый литерал можно присвоить переменной типа char*.Это разрешается потому что в
предыдущих определениях С и С++ типом строкового литерала был char*.Благодаря такому разрешению миллионы строк кода С и С++ остаются синтаксически корректными.Однако изменения строкового литерала через такой указатель является ошибкой :
void f()
{
char* p = "Платон";
p[4] = 'e'; // ошибка : присваивание константе;
// результат не определен
}
Такого рода ошибки,как правило,не могут быть выявлены до выполнения программы.Кроме того,различные реализации по разному относятся к нарушению этого правила.То,что строковые литералы являются константами,не только является очевидным,но и позволяет при реализации произвести значительную оптимизацию методов хранения и доступа к строковым литералам...

PM MAIL   Вверх
Dims
Дата 14.11.2007, 03:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



У меня компилируется без ошибок, а ошибка возникает во время исполнения.

Это происходит потому, что вот в этом коде

Код

char* y = "Hello";


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

А вот в этом коде

Код

char ch[] = "Hello";


ты в нормальной памяти заводишь массив, который ИНИЦИАЛИЗИРУЕШЬ текстовой строкой.

По логике, здесь ошибка в компилляторе. Если написать вот так

Код

char ch[] = "Hello";
const char *z = "Hello";
char* y = z;


то у меня в третьей строчке возникает ошибка во время компилляции

Error    1    error C2440: 'initializing' : cannot convert from 'const char *' to 'char *'    

но ведь ровно то же самое происходит и в строчке

Код

char* y = "Hello";


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

Код

const char* y = "Hello";


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

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




Это сообщение отредактировал(а) Dims - 14.11.2007, 03:28
PM MAIL   Вверх
zkv
Дата 14.11.2007, 04:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Dims, вроде все это было в приведенной цитате.  smile 
PM MAIL   Вверх
Dims
Дата 14.11.2007, 04:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Цитата(zkv @  14.11.2007,  04:15 Найти цитируемый пост)
Dims, вроде все это было в приведенной цитате. 

Пардон, сперва вообще не увидел в цитате про совместимость. Кроме того, мне показалось, что требуется более развёрнутое объяснение. Страуступ пишет, как мне кажется, слишком бегло.
PM MAIL   Вверх
Maka6er
Дата 14.11.2007, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 27.2.2007
Где: Киев

Репутация: нет
Всего: 3



Спасибо за ответы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0453 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.