C strcpy () копирует строковые литералы без ошибки сегментации - PullRequest
0 голосов
/ 16 декабря 2018

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

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

int main() {
  char* scr = "hello";
  strcpy(scr,scr);
  printf("%s\n",scr);
  return 0;
}

output: hello

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

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

int main() {
  char* scr = "hello";
  char* dst = "hello";
  strcpy(dst,scr);
  printf("%s\n",dst);
  return 0;
}

output: ошибка сегментации (сбрасывается ядро)

в соответствии сРеализация strcpy () в книге K & R похожа на приведенную ниже

void strcpy(char *s, char *t)
{
while ((*s = *t) != '\0') {
  s++;
  t++;
  }
}

, если это так, у меня должна быть ошибка сегментации в обоих случаях.

сведения о компиляторе:

gcc версия7.3.0 (Ubuntu 7.3.0-27ubuntu1 ~ 18.04)

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Строковые литералы во многих системах размещаются в ячейках памяти RO.Это делают самые популярные компиляторы под наиболее популярные ОС (Windows, Linux, Mac OS и т. Д.).Но многие другие (например, avr-gcc) этого не делают.

Таким образом, segfault - не единственный возможный эффект этого UB.

Но в вашем случае я уверен, что компилятор оптимизировал вызов strcpy как копированиеобъект сам по себе не нужен.

0 голосов
/ 16 декабря 2018

строковые литералы хранятся в постоянном запоминающем устройстве, и его изменение во время выполнения приводит к ошибке сегментации,

Нет, вы ошибаетесь.Он вызывает неопределенное поведение , и ошибка сегментации является одним из многих возможных эффектов UB.

Цитирование C11, глава §6.4.5 / P7, Строковые литералы

[...] Если программа пытается изменить такой массив, поведение не определено.

...