Почему я не могу использовать этот код для перезаписи строки? - PullRequest
2 голосов
/ 08 февраля 2010

Код

#include "stdio.h"
#include "string.h"

int main()
{
  char *p = "abc";
  printf("p is %s \n", p);
  return 0;
}

выход

p is abc

Код

#include "stdio.h"
#include "string.h"

int main()
{
  char *p = "abc";
  strcpy(p, "def");
  printf("p is %s \n",p);
  return 0;
}

выход

Segmentation fault (core dumped)

Может ли кто-нибудь объяснить, почему это происходит?

Ответы [ 4 ]

8 голосов
/ 08 февраля 2010

В вашем коде:

char *p="abc";

p указывает на строковый литерал - вам не разрешено изменять строковые литералы, что пытается сделать ваш вызов strcpy Вместо этого сделайте p массивом:

char p[] = "abc";

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

4 голосов
/ 08 февраля 2010

Поскольку p указывает на область памяти только для чтения (сегмент __TEXT), которая содержит строку "abc".

Как вы strcpy, область памяти только для чтения будет перезаписана, что недопустимо. Так что ядро ​​SegFault будет вашей программой.

Если вам нужна доступная для записи память, вам нужно выделить ее в стеке

char p[1024] = "abc";

или в кучу

char* p = malloc(1024);
...
free(p);

или в сегменте __DATA (то есть глобальной переменной)

static char p[1024] = "abc";
2 голосов
/ 08 февраля 2010

Поскольку p указывает на постоянную память.

Перезапись данных, p указывает на неопределенное поведение. Строковый литерал - это любая строка, которую вы явно указываете в кавычках. Все строковые литералы только для чтения. (Примечание. Вы можете использовать строковый литерал для инициализации массива символов.)

Вместо этого вам нужно выделить свой собственный буфер следующим образом:

char buffer[4];
strcpy(buffer, "def");
printf("buffer is %s \n", buffer);
1 голос
/ 08 февраля 2010

p - это просто указатель на данные только для чтения (в вашем случае это «abc»). Вы не можете перезаписать это с помощью "def".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...