_wcsrev
От: Аноним  
Дата: 30.12.02 17:57
Оценка:
Добавлена раскраска кода. -- ПК.

wchar_t * __cdecl _wcsrev (
        wchar_t * string
        )
{
        wchar_t *start = string;
        wchar_t *left = string;
        wchar_t ch;

        while (*string++)                                 
             ;
        string -= 2;

        while (left < string)
        {
                ch = *left;
                *left++ = *string; 
                *string-- = ch;
        }

        return(start);
}

void main()
{
 // wchar_t* wsz = L"test";
 wchar_t[] wsz = L"test";
 _wcsrev(wsz);
}


если вместо wchar_t* писать wchar_t[] то все компилится елси писать наоборот — то нет (access violation в *left++ = *string;) Почему ?
Re: _wcsrev
От: spring  
Дата: 30.12.02 20:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А> // wchar_t* wsz = L"test";

присваивание ссылки на константную область памяти!
А> wchar_t[] wsz = L"test";
создание локальной копии строки
если, не туплю, конечно.
Re: _wcsrev
От: menify Россия  
Дата: 30.12.02 23:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А> если вместо wchar_t* писать wchar_t[] то все компилится

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

А> елси писать наоборот — то нет (access violation в *left++ = *string

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

А> Почему ?

Ты не можешь писать в эту память.
Всего доброго.
Re[2]: _wcsrev
От: Аноним  
Дата: 31.12.02 09:53
Оценка:
Здравствуйте, menify, Вы писали:

А>> елси писать наоборот — то нет (access violation в *left++ = *string

M>Ты просто обьявляешь указатель на строку, которая выделяется во время компиляции в сегменте памяти с атрибутом READ ONLY.
1)Но я же не обьявляю указатель как wchar_t* <b>const</b> wsz = L"test";
2)А как зделать чтобы память под строку выделялась во время компиляции в сегменте памяти с атрибутом <b>не</b> READ ONLY.
Re[3]: _wcsrev
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 31.12.02 11:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>1)Но я же не обьявляю указатель как wchar_t* <b>const</b> wsz = L"test";

А>2)А как зделать чтобы память под строку выделялась во время компиляции в сегменте памяти с атрибутом <b>не</b> READ ONLY.

Насколько мне известно, под MS — никак. Можно попробовать поиграться опциями /Gf, /GF (Eliminate Duplicate Strings), но это не наверняка. А так, единственный доступный способ — это char sz[] = "text": гарантированно копирует строку на стек.
- Искренне ваш, Поросенок Пафнутий
Re[3]: _wcsrev
От: Андрей Тарасевич Беларусь  
Дата: 01.01.03 05:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, menify, Вы писали:


А>>> елси писать наоборот — то нет (access violation в *left++ = *string

M>>Ты просто обьявляешь указатель на строку, которая выделяется во время компиляции в сегменте памяти с атрибутом READ ONLY.
А>1)Но я же не обьявляю указатель как wchar_t* <b>const</b> wsz = L"test";

Как ты объявляешь указатель не имеет никакого значения. Строковый литерал в С/С++ сам по себе является константным объектом.

А>2)А как зделать чтобы память под строку выделялась во время компиляции в сегменте памяти с атрибутом <b>не</b> READ ONLY.


Ты уже сам это делал:

wchar_t wsz[] = L"test";


В такой ситуации строковый литерал будет скопирован в изменяемую область памяти. Сделать так, чтобы сам строковый литерал являлся изменямым в С/С++ нельзя никак. Строковые литералы константны всегда.
Best regards,
Андрей Тарасевич
Re[3]: _wcsrev
От: menify Россия  
Дата: 02.01.03 06:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, menify, Вы писали:


А>>> елси писать наоборот — то нет (access violation в *left++ = *string

M>>Ты просто обьявляешь указатель на строку, которая выделяется во время компиляции в сегменте памяти с атрибутом READ ONLY.
А>1)Но я же не обьявляю указатель как wchar_t* <b>const</b> wsz = L"test";
Какая разница строка "test" создается в памяти с атрибутом READ ONLY.
Никакое преобразование типов не поможет.

А>2)А как зделать чтобы память под строку выделялась во время компиляции в сегменте памяти с атрибутом <b>не</b> READ ONLY.

Если я не ошибаюсь MSVC размещает строки в не изменяемой памяти только в дебужной версии кода, в релиной вроде это может и прокатить.


Если очень нужно создать в изменяемой памяти, более правильно делать так:
static char  s_name[] = "test";

или так:
static char  s_name[] = {'t','e','s','t','\0'};


напишешь const
static const char  s_name[] = "test";

будет создано с атрибутом READ ONLY
Всего доброго.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.