Добавлена раскраска кода. -- ПК.
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;) Почему ?
Здравствуйте, Аноним, Вы писали:
А> если вместо wchar_t* писать wchar_t[] то все компилится
Память под строку выделяется в стеке и строка копируется в стек
А> елси писать наоборот — то нет (access violation в *left++ = *string
Ты просто обьявляешь указатель на строку, которая выделяется во время компиляции в сегменте памяти с атрибутом READ ONLY.
А> Почему ?
Ты не можешь писать в эту память.
Здравствуйте, menify, Вы писали:
А>> елси писать наоборот — то нет (access violation в *left++ = *string
M>Ты просто обьявляешь указатель на строку, которая выделяется во время компиляции в сегменте памяти с атрибутом READ ONLY.
1)Но я же не обьявляю указатель как wchar_t* <b>const</b> wsz = L"test";
2)А как зделать чтобы память под строку выделялась во время компиляции в сегменте памяти с атрибутом <b>не</b> READ ONLY.
Здравствуйте, Аноним, Вы писали:
А>1)Но я же не обьявляю указатель как wchar_t* <b>const</b> wsz = L"test";
А>2)А как зделать чтобы память под строку выделялась во время компиляции в сегменте памяти с атрибутом <b>не</b> READ ONLY.
Насколько мне известно, под MS — никак.

Можно попробовать поиграться опциями /Gf, /GF (Eliminate Duplicate Strings), но это не наверняка. А так, единственный доступный способ — это char sz[] = "text": гарантированно копирует строку на стек.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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";
В такой ситуации строковый литерал будет скопирован в изменяемую область памяти. Сделать так, чтобы сам строковый литерал являлся изменямым в С/С++ нельзя никак. Строковые литералы константны всегда.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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