В чем разница между определением строки в виде массива или указателя на символ? - PullRequest
0 голосов
/ 19 января 2020

Когда я выполняю приведенный ниже код,

#include <stdio.h>
#include <string.h>
int main ( ){
    char string [] = "Home Sweet Home";
    printf ("%s",(char*)memmove(string,&string[5],10));
    }

, вывод «Sweet Home Home».

Но; когда я изменяю код, как показано ниже,

#include <stdio.h>
#include <string.h>

int main ( )
{
    char* string = "Home Sweet Home";
    printf ("%s",(char*)memmove(string,&string[5],10));

}

это дает ошибку сегментации.

Что изменяется, когда я определяю этот массив как указатель на символ?

1 Ответ

2 голосов
/ 19 января 2020

Что меняется, когда я определяю этот массив как указатель на символ?

В этом случае самое главное: изменчивость данных изменяется.

char string [] = "Home Sweet Home";

"Home Sweet Home" здесь представляет собой инициализатор для массива string. Инициализирует строку с символами с нулевым завершающим символом. Размер массива определяется из инициализатора (если я считаю правильно), это 16 символов. Массив string объявлен как char, поэтому он может изменяться, и вы можете его изменить.

char* string = "Home Sweet Home";

Здесь "Home Sweet Home" представляет собой строковый литерал , Строковые литералы неизменны, не модифицируемы, не могут быть изменены. Указатель на строковый литерал хранится в string указателе. Изменение строкового литерала приводит к неопределенному поведению. Ошибка сегментации - это ошибка, когда программа обращается к области памяти, к которой у нее нет доступа. В этом случае программа пытается выполнить запись в область памяти, которую нельзя изменять.

...