Манипулирование строковыми литералами - копирование символов - PullRequest
0 голосов
/ 14 сентября 2011

Я пытаюсь реализовать простую копию строки в следующем коде.

Однако я получил ошибку во время выполнения в строке "* d = * c;".

Может кто-нибудь сказать мне, что с этим не так?

void test3()
{
    char *a="123456";
    char *b="000000";

    char *c=a;
    char *d=b;

    while(*c){
        *d = *c;
        cout << *c << endl;
        c++;
        d++;
    }

    *d='\0';
}

Ответы [ 5 ]

6 голосов
/ 14 сентября 2011

Вы не можете изменять постоянные данные.Эти строки, которые вы предоставляете (литеральные строки), хранятся в доступной только для чтения области программы.Фактически, любой строковый литерал, который вы предоставляете в своей программе, например, "000000", считается const char* (указатель на константные символы), поэтому вы не можете (по крайней мере, не рекомендуется) изменять их.

5 голосов
/ 14 сентября 2011

По существу, строковые литералы постоянны и не могут быть изменены.В следующей строке:

char *a="123456";

char *a следует заменить на const char * a, поскольку a указывает на блок постоянной памяти.Далее в функции вы пытаетесь изменить этот блок постоянной памяти, и это приводит к ошибке времени выполнения.

Чтобы получить массив реальных символов, который вы можете использовать в такой функции, вы должны использовать:

char a[] = "123456";

Это создаст изменяемый (неконстантный) массив, которым вы можете свободно манипулировать.

2 голосов
/ 14 сентября 2011

И *d=*c, и *d='\0' не работают, потому что вы не можете изменять эти значения, полученные из строковых литералов. Они не модифицируются. Если бы вы использовали const, как предполагалось, то вы бы не допустили эту ошибку.

2 голосов
/ 14 сентября 2011

Вы пытаетесь изменить литерал, который компилятор обычно помещает в доступную только для чтения часть исполняемого файла; современные процессоры имеют аппаратные блокировки, чтобы предотвратить появление вирусов.

Вы можете исправить это, предоставив свой собственный массив символов, который можно инициализировать с помощью литерала:

char b[] = "000000";
1 голос
/ 14 сентября 2011

Поскольку вы присвоили оба указателя c и d постоянным строкам, вы не можете их изменить!Вам нужно было бы выделить массив символов для d, чтобы это работало:

char d[MAX_CHAR];
...