簡體   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