2011-07-23 59 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' null终止目标。你可能希望你也这样做。 –

+0

你可以把这个循环写成'while(* src)* dst ++ = * srC++;'这个事实被很多人认为是C的最大优点之一。我明白这样的代码会让新手感到恐慌,但对于我们来说,盯着这样的代码很多很多年,它的密集度就像简单而纯粹的美丽。还要注意Charles所说的。 “do ... while”循环会更好。 – sbi

回答

-3

而{ * DST = * SRC(* SRC = '\ 0'!)

你需要在这里提领你的指针,使用&,而不是*

编辑:

看起来像我有我自己的个人颅段错误,在这里 - 在早晨太早!

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。你应该试试

char str1[]="abc"; 
char str2[]="def"; 
+1

正确。但与C++不同,字符串文字的类型为“char []”,而不是“const char []”,因此编译器在尝试修改字符串文字时通常不会发出警告。这有点不一致,但它被定义为避免破坏现有代码(从“const”被添加到该语言之前)。你可以通过声明'const char * str1 =“abc”'来帮助编译器。 –