读书人

关于字符串复制代码的迷惑

发布时间: 2012-10-16 09:57:37 作者: rapoo

关于字符串复制代码的困惑
在下正边看边写代码,前两天看到指针这部分,于是模仿写了个字符串复制方法,如下:
void str_cpy(ori, to)
char *ori, *to;
{
while ( (*ori++ = *to++) != '\0' ){}
}

main()
{
char *s1 = "I am fine."; //这儿定义为指针变量行不通
char *s2 = "come on"; //这儿定义为指针变量行不通
printf("s1 = %s\ns2 = %s", s1, s2);
str_cpy(s1, s2);
printf("\ns1 = %s\ns2 = %s", s1, s2);
system("PAUSE");
}
当我将s1和s2定义为指针变量时程序执行不下去,而如果我将s1和s2换成字符数组就没问题即:
char s1[20] = "I am fine."; //定义为字符数组就ok了
char s2[20] = "come on."; //定义为字符数组就ok了

小弟愚笨,实在搞不清楚这其中的区别,还请大家指点迷津,谢谢!

[解决办法]
char *s1 = "I am fine."; //这儿定义为指针变量行不通
char *s2 = "come on"; //这儿定义为指针变量行不通

s1、s2所指的内存是不可写的!!

char s1[20] = "I am fine."; //定义为字符数组就ok了
char s2[20] = "come on."; //定义为字符数组就ok了

s1、s2所指的内存是可写的!!

内存地址不一样而已!第一种是全局数据常量区,第二种是栈空间
[解决办法]
char *s1 = "I am fine."; char *s2 = "come on"; 等价于
const char *s1 = "I am fine; const char *s2 = "come on";
这两个都是指向常量字符串的指针,s1,s2这两个指针都没分配内存空间,你用str_cpy(s1, s2);企图修改 肯定是不行的.
[解决办法]
VC6调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。

想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!

[解决办法]

探讨
在下正边看边写代码,前两天看到指针这部分,于是模仿写了个字符串复制方法,如下:
void str_cpy(ori, to)
char *ori, *to;
{
    while ( (*ori++ = *to++) != '\0' ){}
}

main()
{
    char *s1 = "I am fine.";  //这儿定义为指针变量行不通
    char *s2 = "come on";  //这儿定义为指针变量行不通
    printf("s1 = %s\ns2 = %s", s1, s2);
    str_cpy(s1, s2);
    printf("\ns1 = %s\ns2 = %s", s1, s2);
    system("PAUSE");
}
当我将s1和s2定义为指针变量时程序执行不下去,而如果我将s1和s2换成字符数组就没问题即:
char s1[20] = "I am fine.";  //定义为字符数组就ok了
char s2[20] = "come on.";  //定义为字符数组就ok了

小弟愚笨,实在搞不清楚这其中的区别,还请大家指点迷津,谢谢!

[解决办法]
探讨
we_sky2008,不好意思,我的注释有歧义,其实这句代码本身没问题,问题是出在定义为指针变量后程序执行不下去。:-)

[解决办法]
探讨
谢谢we_sky2008童鞋,你真是个认真仔细的人,感激不尽!

读书人网 >C++

热点推荐