Программа прерывается при использовании strcpy для указателя на символ? (Отлично работает на массиве символов) - PullRequest
9 голосов
/ 13 апреля 2011

Я озадачен тем, почему следующее не работает:

char * f = "abcdef";
strcpy(f, "abcdef");
printf("%s",f);

char s[] = "ddd";
strcpy(&s[0], "eee");
printf("%s", s);

В обоих примерах strcpy получил символ *, но в первом примере он умирает ужасной смертью.

Ответы [ 8 ]

11 голосов
/ 13 апреля 2011

"abcdef" и "ddd" - строковые литералы, которые могут находиться в разделе только для чтения вашего адресного пространства. char s[] = "ddd" гарантирует, что этот литерал скопирован в стек - так что он может быть изменен.

6 голосов
/ 13 апреля 2011

char * f = "abcdef"; определяет символьный указатель на "abcdef", который находится в области только для чтения, поэтому вы не можете писать в это место

char s[] = "ddd"; определяет массив символов в стеке , который доступен для записи.

5 голосов
/ 13 апреля 2011

В первом примере у вас есть указатель на строковый литерал. Этот указатель должен действительно быть const char *, потому что любая попытка изменить строковый литерал является неопределенным поведением. Однако по старым причинам вы можете использовать char * для указания на него. Но вы все равно не должны пытаться изменить его.

Во второй версии у вас есть стандартный болотный массив, содержимое которого инициализировано эквивалентно вашей строке. Это можно изменить, так как это ваш массив.

4 голосов
/ 13 апреля 2011

Первый пример - символьный литерал char * (литерал "something").Символьные литералы доступны только для чтения, и попытка записи в них может привести к сбоям.Ваш первый указатель действительно должен быть const char *f = "abcdef";, который strcpy не займет.

2 голосов
/ 13 апреля 2011

Строковые литералы считаются доступными только для чтения большинством компиляторов, поэтому память, в которой они находятся, может быть помечена как доступная только для чтения, что приводит к ошибке времени выполнения.

Чтобы это работало, выполните следующие действия:

char * f = strdup("abcdef");
strcpy(f, "abcdef");
printf("%s",f);
free(f);

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

2 голосов
/ 13 апреля 2011

Оператор char * f = "abcdef" назначает точку в памяти буквальной строке «abcdef», однако он откажется разрешить вам изменять ее содержимое, пока память не будет выделена динамически - это эквивалентно const char.
Всевы создаете указатель в памяти и затем записываете следующие 6 байтов, что недопустимо в C.

0 голосов
/ 13 апреля 2011
0 голосов
/ 13 апреля 2011

Вы, обратитесь к это

ссылка, как использовать strcpy для указателей на символы.

...