Вот такой простой код приводит к undefined behaviour.
#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char *argv[])
{
char*str="Hello, world";
cout <<str<<endl;
str[6]='!';
cout <<str<<endl;
return EXIT_SUCCESS;
}
А все потому ,что строковый литерал есть "массив с надлежащим количеством константных символов", и, следовательно, присваивание константе незаконно. И поймать это можно только в рантайме. В моем тестовом случае это привело к segmentation fault.
Зато при замене "char *str" на логичное "char str[]" всё работает как положено. А вообще раз уж используется STL, то про строки в виде обычных массивов элементов char можно забыть и использовать string/vector в зависимости от ситуации.
ReplyDeleteконечно, char str[]="something" - инициализирует массив, а char* str="something" - инициализирует указатель (если можно так выразится)
ReplyDeleteСовершенно верно.
ReplyDeleteПохожий пост const overload functions taking char pointers в блоге C++ Truth. В частности, поясняется, почему возникает segmentation fault
ReplyDeleteПри такой инициализации надо писать
ReplyDeleteconst char*, а не просто char. Ошибка находится именно в этом моменте, ни раньше, ни позже.
почему? желательно со ссылкой на стандарт =)
ReplyDelete