繁体   English   中英

C strcpy()复制字符串文字而没有分段错误

[英]C strcpy() copies string literals without segmentation fault

据我了解,字符串文字存储在只读存储器中,并且在运行时对其进行修改会导致分段错误,但是下面的代码在编译时不会出现分段错误。

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

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

输出:你好

同样,如果我尝试将源字符串复制到不同的目标字符串文字,则会引发分段错误

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

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

输出:分段故障(核心已转储)

根据K&R的书,strcpy()的实现与下面类似

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

如果是这样,两种情况下我都应该遇到细分错误。

编译器详细信息:

gcc版本7.3.0(Ubuntu 7.3.0-27ubuntu1〜18.04)

字符串文字存储在只读存储器中,在运行时对其进行修改会导致分段错误,

不,你错了。 它调用未定义的行为 ,而分段错误是UB可能造成的许多影响之一。

引用C11 ,第6.4.5 / P7章, 字符串文字

[...]如果程序尝试修改此类数组,则行为未定义。

许多系统上的字符串文字都放置在RO内存位置。 在最流行的操作系统下(Windows,Linux,mac os等),最流行的编译器可以执行此操作。 但是其他许多(例如avr-gcc)却没有。

因此,段错误不是此UB的唯一可能效果。

但是在您的情况下,我敢打赌,编译器已经优化了strcpy调用,因为不需要将对象复制到自身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM