2012-10-08 34 views
1

我正在理解指针。我在C.为什么这个指针操作失败?

#include<stdio.h> 

char *my_strcpy(char *dest, char *source) 
{ 
    while (*source != '\0') 
    { 
    *dest++ = *source++; 
    } 
    *dest = '\0'; 
return dest; 
} 

int main(void) 
{ 
    char* temp="temp"; 
    char* temp1=NULL; 
    my_strcpy(temp1,temp); 
    puts(temp1); 



    return 0; 

} 

写这个字符串拷贝功能,这个程序给出了一个segfault.If我改变char* temp1=NULLchar* temp1还是失败。如果我将char* temp1更改为char temp1[80],则代码有效。该代码也可以工作,如果char temp1[1]并给出输出作为温度。我在想输出应该是t。为什么它是这样的,为什么我会遇到char* temp错误。

+0

为什么这个downvoted? – gizgok

回答

5

因为您没有为目标字符串分配空间。您正在尝试写入内存位置NULL(几乎可以肯定是0x00)。

尝试char* temp1= malloc(strlen(temp)+1);或类似的东西。这将分配一些内存,然后你可以复制字符到它。 +1用于结尾的空字符。

如果你写了Java和朋友,它会阻止你访问阵列末尾的内存。但是在语言层面上,C可以让你在任何你想要的地方写入内存。然后崩溃(希望立即但可能在下周)。数组不是严格执行的数据类型,它们只是分配和引用内存的惯例。

如果你创建它为char temp1[1]那么你正在堆栈上分配一些内存。可能可以访问附近的内存(可以读取和写入),但是您将在其他内存中使用其他内存。这是一个经典的内存错误。

也风格:我个人建议不要使用++ s的返回值。这很难阅读,让你思考三次。

*dest = *source; 
dest++; 
source++; 

更清楚。但那只是我的个人意见。

+0

这并不能解释为什么分配一个字节(使用temp1 [1])允许存储完整的字符串。或者那是运气? – Joost

+0

啊,是的,我已经添加了解释。 – Joe

+0

感谢您的答案......它现在有效。 – gizgok

0

您必须为目标参数分配空间。

当您使用char temp1[80]时,将在内存中分配80个字节。

可以在静态的方式分配内存,像阵列,或使用malloc功能