这个问题,平常也经常碰到,今天写程序的时候又遇到,还是应该总结一下。
先贴代码:
1 #include <stdio.h>
2 char * mystrcpy(char *dest,const char *src)
3 {
4 if(dest == NULL || src==NULL)
5 {
6 printf("invalid\n");
7 return NULL;
8 }
9 char *temp = dest;
10 while(*src!='\0')
11 {
12 *temp = *src;
13 temp++;
14 src++;
15 }
16 *temp='\0';
17 return dest;
18
19 }
20
21 int main()
22 {
23 // char *p="hello";
24 // char *s="hello world";
25 char p[20] = "hello";
26 char s[20] = "hello world";
27 printf("%s\n",mystrcpy(p,s));
30 return 0;
31 }
主要是自己编写一个strcpy函数,测试下,函数实现到时没啥问题,在main函数中,出现问题了。
起先,我使用的是23,24行代码,出现段错误,然后改为25,26行,成功运行结果,打印出hello world.
下面我来分析一下,“hello”和“hello world”是字符串常量,存储在内存中的静态存储区,23,24行定义的指针指向这些字符串常量,这些常量在内存中任然只有一份,保存在静态存储区,所以通过这个指针来修改字符串常量是非法的,会报段错误。而25,26行定义字符数组是在栈中开辟的,赋值操作,相当于在栈中又添加了一份拷贝,在内存中就有两份拷贝,我们操作的只是栈中的那一份,程序结束后就自动释放了。
由此一来,便可以理解了。