Указатели. Ошибка

833
28 января 2019, 14:30
#include <iostream>
using namespace std;
void main() {
    char *str = "Hello";
}

значение типа const char нельзя использовать для инициализации сущности типа char.

В видео уроке который я смотрел, написано абсолютно так же. В чём проблема?

Answer 1

Проблема в том, что, строго говоря, литерал строки - константен, и компилятор может, например, разместить его в памяти только для чтения.

Если бы было можно написать

char *str = "Hello";

то можно было бы его изменить, например, с помощью

str[0] = '!';

что является нарушением. Так что используйте

const char *str = "Hello";

или

char str[] = "Hello";

(в последнем случае литерал строки копируется в изменяемый массив str).

Answer 2

Наличие реальной проблемы в данном случае зависит от компилятора. Если используете gcc, то даже можно ее испытать.

$ cat 1.cpp
int main() {
    char *str = "Hello";
    str[0] = '!'; // собственно, пытаемся поменять содержимое
    return 0;
}
$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ -o 1 1.cpp
1.cpp: In function ‘int main()’:
1.cpp:2:17: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
     char *str = "Hello";
             ^
$ ./1 # запускаем и получаем ошибку сегментации
Segmentation fault (core dumped)

В статье на вики про ошибку сегментации как раз нечто похожее и обсуждается. Такая ошибка возникает, когда программа пытается что-то сделать с памятью, что ей нельзя. В данном случае - программа пытается изменить содержимое памяти, доступной ей только для чтения.

Тем не менее, не во всех случаях это приводит к проблемам, но предпочтительно не пытаться менять то, что имеет квалификатор const.

READ ALSO
Отсутствует оператор [закрыт]

Отсутствует оператор [закрыт]

Отсутствует оператор ">>" соответствующий этим операндам

525
Универсальное имя символа

Универсальное имя символа

Неправильно сформировано универсальное имя символа, в чём проблема?

445
Qt стили градиентов

Qt стили градиентов

Вопрос по QSSЕсть возможность установки градиентов для виджетов

295
Как использовать CURL в приложении windows form C++

Как использовать CURL в приложении windows form C++

Пытаюсь работать с библиотекой С++ curl в проекте windows form C++

217