Литерал "Hello"
не будет создан в стеке. Он будет храниться в секции статического чтения только скомпилированного объектного файла или двоичного файла, а char *x
будет только указателем на него. Он не сохранит строку. Это назначение возможно только в С, хотя, я считаю, из-за его слабого контроля типа. В C++ вы можете сделать присвоение переменной const char*
.
Это:
char x[] = "Hello";
будет фактически хранить строку в массив символов в стеке и массив не должен быть const
.
strcpy
Ввод строкового литерала в malloc
Редактирование памяти также будет выполнено, если вы хотите перезаписываемую версию строкового литерала.
Во всяком случае, этот глючный код:
char y = "Hello World!";
char *x = &y;
будет скомпилирован в gcc
, но с предупреждением. Строковый литерал будет автоконвертироваться в указатель char *
, который автоматически конвертирует в целое число, которое автоматически отменяет char, но это совсем не то, что вы хотите.
Наблюдение: ваше имя пользователя не один, что делает людей хотят, чтобы помочь вам. –
Ваш исходный пример символов не работает; 'char y =" Hello World! ";' является основным несоответствием типа (указатель, присвоенный 'char'). Если у вас есть 'char y = 'H';', вы можете использовать 'char * x = & y;' - это законно (хотя 'y' не указывает на символьную строку, а указывает только на один символ). Строки - это массивы символов с нулевым терминатором. –
Раньше я думал, что переполнение стека было для людей, поврежденных мозгом. Затем я получил реальную черепно-мозговую травму, и я полностью уверен, что теперь это потрясающе. Правдивая история. : D – PSkocik