Access violation
От: Аноним  
Дата: 09.02.11 08:14
Оценка: :))
Помогите, что-то туплю...

Код:

void ReplaceNULL(wchar_t *str, const wchar_t *strSearch, size_t size)
{
    wchar_t *p = wcsstr(str, strSearch);
    if (p)
    {
        // Unhandled exception 0xC0000005: Access violation writing location 0x00417bfa.
        *p = ' ';
        *(p+size-1) = ' ';
    }
}

#define NULL_STRING L"'NULL'"
#define null_string L"'null'"

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    wchar_t *buff = L"insert into table ([Id], [Name], [Value]) values (1, 'Name', 'NULL')";
    ReplaceNULL(buff, NULL_STRING, sizeof(NULL_STRING)/sizeof(wchar_t)-1);
    ReplaceNULL(buff, null_string, sizeof(null_string)/sizeof(wchar_t)-1);

    return 0;
}


В строчке *p = ' ' происходит Access violation..
Что тут не так????

С Уважением,
Александр.
Re: Access violation
От: winston Россия  
Дата: 09.02.11 08:27
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Помогите, что-то туплю...

А>Код:
А> wchar_t *buff = L"insert into table ([Id], [Name], [Value]) values (1, 'Name', 'NULL')";


buff — это указатель на const data, ее менять нельзя. По идее при таком объявлении всегда нужно ставить const
const wchar_t *buff = L"insert into table ([Id], [Name], [Value]) values (1, 'Name', 'NULL')";
Re[2]: Access violation
От: alisichkin  
Дата: 09.02.11 08:38
Оценка:
Здравствуйте, winston, Вы писали:

W>Здравствуйте, Аноним, Вы писали:


А>>Помогите, что-то туплю...

А>>Код:
А>> wchar_t *buff = L"insert into table ([Id], [Name], [Value]) values (1, 'Name', 'NULL')";


W>buff — это указатель на const data, ее менять нельзя. По идее при таком объявлении всегда нужно ставить const

W>
W>const wchar_t *buff = L"insert into table ([Id], [Name], [Value]) values (1, 'Name', 'NULL')";
W>


Да Вы правы работает код:
wchar_t buff[] = L"insert into table ([Id], [Name], [Value]) values (1, 'Name', 'NULL')";


Век живи, век учись.
По моему слишком широкие возможности С — источник трудноуловимых ошибок :\
Re[3]: Access violation
От: szag  
Дата: 09.02.11 20:09
Оценка:
Здравствуйте, alisichkin, Вы писали:

A>По моему слишком широкие возможности С — источник трудноуловимых ошибок :\


чем больше возможностей предоставляет инструмент, тем больше возможностей использовать их не по назначению.
И тут надо понимать, кто виноват — инструмент или его пользователь
Re: Access violation
От: nen777w  
Дата: 09.02.11 22:57
Оценка:
А>С Уважением,
А>Александр.

Палишся
Re[2]: Access violation
От: antonio_banderas Россия  
Дата: 11.02.11 13:03
Оценка:
Здравствуйте, winston, Вы писали:

W>Здравствуйте, Аноним, Вы писали:


А>>Помогите, что-то туплю...

А>>Код:
А>> wchar_t *buff = L"insert into table ([Id], [Name], [Value]) values (1, 'Name', 'NULL')";


W>buff — это указатель на const data, ее менять нельзя. По идее при таком объявлении всегда нужно ставить const

W>
W>const wchar_t *buff = L"insert into table ([Id], [Name], [Value]) values (1, 'Name', 'NULL')";
W>


Да. Официально это называется "строковый литерал", который может быть расположен в константной области памяти и соответственно при его модификации будет UB.
(для студии реально происходит так: в дебаге генерится исключение, в релизе в 2008 студии работает с прежним литералом, как будто я изменения не вносил вовсе, а когда-то раньше проверял, в одной из прежних студий, в релизе изменения вносились, но если было несколько одинаковых строковых литералов, то лишние дубликаты выкидывались для оптимизации и соответственно эти изменения затрагивали и все остальные литералы-дубликаты)
Но тем не менее менять литералы нельзя.
Хорошо бы, чтоб в новом стандарте неконстантный указатель на строковый литерал наконец запретили.
Re[3]: Access violation
От: Masterkent  
Дата: 11.02.11 19:46
Оценка:
antonio_banderas:

_>Хорошо бы, чтоб в новом стандарте неконстантный указатель на строковый литерал наконец запретили.


Запретить можно лишь неявное преобразование строкового литерала в указатель с потерей константности, и соответствующее изменение в черновик C++0x уже внесено (тем не менее, напомню, что стандарт позволяет и будет позволять компиляторам успешно компилировать любые ill-formed программы).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.