Помогите, что-то туплю...
Код:
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..

Что тут не так????
С Уважением,
Александр.
Здравствуйте, Аноним, Вы писали:
А>Помогите, что-то туплю...
А>Код:
А> 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')";
Здравствуйте, 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')";
Век живи, век учись.
По моему слишком широкие возможности С — источник трудноуловимых ошибок :\
Здравствуйте, alisichkin, Вы писали:
A>По моему слишком широкие возможности С — источник трудноуловимых ошибок :\
чем больше возможностей предоставляет инструмент, тем больше возможностей использовать их не по назначению.
И тут надо понимать, кто виноват — инструмент или его пользователь
Здравствуйте, 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 студии работает с прежним литералом, как будто я изменения не вносил вовсе, а когда-то раньше проверял, в одной из прежних студий, в релизе изменения вносились, но если было несколько одинаковых строковых литералов, то лишние дубликаты выкидывались для оптимизации и соответственно эти изменения затрагивали и все остальные литералы-дубликаты)
Но тем не менее менять литералы нельзя.
Хорошо бы, чтоб в новом стандарте неконстантный указатель на строковый литерал наконец запретили.