2011-07-23 45 views
1

私は単純なstrcpyを実装しますが、それを実行すると、常にセグメンテーションエラーが発生します。 助けてください!なぜstrcpyの実装でセグメンテーションフォルトが発生するのですか?

以下

は私のコードです:

#include <stdio.h> 

char* mystrcpy(char *dst, char *src){ 
    char *ptr = dst; 
    while (*src !='\0') { 
     *dst = *src; 
     dst++; 
     src++; 
    } 
    return ptr; 
} 

int main (int argc, char **argv) { 
    char *str1 = "abc"; 
    char *str2 = "def"; 
    char *str3 = NULL; 
    str3 = mystrcpy(str2, str1); 
    printf("str2 now is %s", str2); 
    printf("str3 is %s", str3); 
    return 0; 
} 
+0

'str1'と' str2'に文字列の内容を格納するスペースがありません。 char str1 [100] = "abc" 'と' char str2 [100] = "def" 'と' char str3 [100] = "" ' – Stan

+4

標準' strcpy'ヌルは宛先を終了します。おそらくあなたは同じことをしたいと思うでしょう。 –

+0

このループを 'while(* src)* dst ++ = * srC++;'と書くことができるという事実は、多くの人がCの最大の強みの1つと考えています。私はそのようなコードが初心者を怖がらせるのですが、そのようなコードを多くの、長年にわたって見つめている、その緻密さは、シンプルさとして出てきて、純粋な美しさです。チャールズが言ったことにも注意してください。 'do ... while'ループが良いでしょう。 – sbi

答えて

-3

中(!* SRC = '\ 0'){ * dstは= * SRC;

あなたは、&を使用して、ここにあなたのポインタを間接参照する必要はありません*

EDIT:

私はここに、私自身の個人的な頭蓋セグメンテーションフォールトを持ってるよう

が見える - あまりにも早朝に!

cnicutarの説明(char *str2 = "def";と定数文字列へのポインタを割り当て、その場所への書き込みしようとしている)は、はるかに説得力のある...

+1

'&'は「参照先アドレス」であり、逆参照ではありません。接頭辞 '*'は正しいです。 –

9

これらは読み取り専用です。それらに書き込むと、の定義されていない動作が発生します。

char *str1="abc"; /* Read-only. */ 
char *str2="def"; 

while (*src !='\0') { 
    *dst = *src; /* Writes into read-only memory. */ 

このC FAQを参照してください:

文字列定数は、実際の定数です。コンパイラはそれらを非書き込み可能なストレージ に配置する可能性があるため、変更することは安全ではありません。

およびanother explanation。お試しください

+1

右。しかし、C++とは違って、文字列リテラルは "const char []"ではなく "char []"型であるため、文字列リテラルを変更しようとするとコンパイラは通常警告しません。これは少し矛盾していますが、既存のコードを破壊することを避けるために定義されています(以前は "const"が言語に追加されていました)。あなたは 'const char * str1 =" abc "'を宣言することによってコンパイラを助けることができます。 –

関連する問題