Вы споткнулись очень старая бородавка обратной совместимости в C++, унаследованный от C и датированный дни, когда было нет такого понятия, как const
. Строковые литералы имеют тип const char [n]
, но, если вы не сообщите своему компилятору, что вам не нужно быть совместимым с кодом до 1990 года, он беззвучно позволит вам указать char *
переменные, чтобы указать на них. Но это не будет позволяет писать через такой указатель. Фактическая память (по возможности) отмечена только для чтения; ошибка «segmentation fault», которую вы наблюдаете, - это то, как операционная система сообщает о попытке записать в постоянную память.
С точки зрения спецификации языка, запись const
данных через не- const
указатель - однако вам удалось установить, что - есть «неопределенное поведение», которое является причудливым способом сказать «программа неправильна, но компилятор не должен выдавать диагностику, и если вы получите скомпилированный исполняемый файл, он может сделать что-нибудь. " «Ошибка сегментации» почти всегда означает, что ваша программа имеет неопределенное поведение в ней где-то.
Если я скомпилировать программу с соответствующими настройками, я получаю сообщение об ошибке:
$ g++ -std=gnu++11 -Wall -Werror test.cc
test.cc: In function ‘int main(int, char**)’:
test.cc:7:19: error: ISO C++ forbids converting a string constant to ‘char*’
[-Werror=write-strings]
char* name = "SAMPLE TEXT";
^~~~~~~~~~~~~
Пока вы не получите достаточно навыков, чтобы знать, когда различные настройки являются более подходящими, компилировать все свои программы на C++ с -std=gnu++11 -Wall -Werror
, или независимо от вашего эквивалента компилятора. (Вы, кажется, использует операционную систему Unix-ароматизатора, так что эти параметры должны работать. Вы также можете -g
и/или -O
.)
Ваша программа может быть сделано, чтобы работать, изменяя его читать
#include <iostream>
#include <cstring>
int
main()
{
char name[] = "SAMPLE TEXT";
std::memset(name, '*', 6);
std::cout << name << '\n';
return 0;
}
=>
$ g++ -std=c++11 -Wall -Werror test.cc
$ ./a.out
****** TEXT
изменение, которое фиксирует ошибку от char *name
к char name[]
; Я изменил и другие вещи, но только для того, чтобы продемонстрировать лучший стиль.То, что это делает, заставляет компилятор копировать строковый литерал в записываемый память при записи до main
. Почему это делает слишком долго, чтобы объяснить здесь; проконсультируйтесь с хорошим учебником на C++.
Не размещайте фотографии текста здесь. Отправьте текст. – EJP