Skip to main content

Просто undefined behaviour

Вот такой простой код приводит к 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.

Comments

  1. Зато при замене "char *str" на логичное "char str[]" всё работает как положено. А вообще раз уж используется STL, то про строки в виде обычных массивов элементов char можно забыть и использовать string/vector в зависимости от ситуации.

    ReplyDelete
  2. конечно, char str[]="something" - инициализирует массив, а char* str="something" - инициализирует указатель (если можно так выразится)

    ReplyDelete
  3. Похожий пост const overload functions taking char pointers в блоге C++ Truth. В частности, поясняется, почему возникает segmentation fault

    ReplyDelete
  4. При такой инициализации надо писать
    const char*, а не просто char. Ошибка находится именно в этом моменте, ни раньше, ни позже.

    ReplyDelete
  5. почему? желательно со ссылкой на стандарт =)

    ReplyDelete

Post a Comment

СООБЩЕНИЕ СПАМЕРАМ: прежде чем пытаться оставить ссылку на свой ресурс в комментарии, прошу обратить внимание на тег nofollow, которым они помечены и зря не терять ни свое ни мое время. А будете упорствовать еще и noindex поставлю