-1
#include <stdio.h>
char *strcpy_r(char* s, char* t);

int main()
{
  char *s = {"Bob"};
  char *t = {"Billy"};
  char *ptr;
  ptr = strcpy_r(s, t);
  printf("%s\n", ptr);

  return 0;
}

char* strcpy_r(char* s, char* t)
{
  if((*s = *t) != '\0')
    strcpy_r(s + 1, t + 1);
  return s;
}

私は練習のためにこれをやっているだけですが、コンパイルしたとき。メインからセグフォルトが発生しました。誰かがこのセグメント障害の原因を教えてもらえますか?

4

4 に答える 4

3

おめでとうございます。未定義の動作を 1 行で 2 回呼び出しました。

まず、文字列リテラルの内容を変更することはできません。したがって、strcpy()ing on"foo"は間違っています。

2 つ目は、できたとしても、文字列よりも短いバッファーに文字列をコピーしていることです。またUBです。

于 2013-03-20T07:01:00.583 に答える
1

定数文字列を変更しようとしています。これは間違っています!定数文字列を変更すると、segfault が発生する可能性があります。

代わりにこれを行います:

  char s[10] = "Bob";
  char t[10] = "Billy";
  char *ptr;
于 2013-03-20T07:00:25.760 に答える
0

引用符で囲まれた文字列を保持するために使用されるメモリを上書きすることはできません。それは即座にセグメンテーション違反になります。

于 2013-03-20T06:59:34.307 に答える
0

文字列リテラルは定数です。つまり、変更できません。また、長い文字列を短い文字列にコピーしようとしています。これにより、宛先文字列の境界を超えて書き込みが行われます。

これらの問題は両方とも、クラッシュを引き起こす可能性のある未定義の動作につながります。


最初の問題を解決するには、宛先文字列に配列を使用する必要があります。他の問題を解決するには、宛先配列が少なくともソース文字列(終了を含む)と同じ大きさであることを確認する必要があります'\0'

于 2013-03-20T06:59:56.430 に答える