六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 54|回复: 0

一个C语言指针问题

[复制链接]

升级  36%

4

主题

4

主题

4

主题

童生

Rank: 1

积分
18
 楼主| 发表于 2013-2-1 09:47:32 | 显示全部楼层 |阅读模式
今天重新拿起C语言的书学习学习,遇到了一个诡异的问题,开始不可理解,现在记录下整个分析过程。
首先上代码:
#include <stdio.h>void strcopy(char *s, char *t){    while ((*s++ = *t++) != '\0')    ;}int main(){    int i = 3;    char a[] = "abcdefg";    char *p;    strcopy(p, a);    printf("%d\n",i);}
我估计大多数人看到这个程序都会认为会打印出3,但是结果出乎意料:


于是我分别做了两次修改,都使程序正常了。
第一次,我把strcopy函数注释掉了
#include <stdio.h>void strcopy(char *s, char *t){    while ((*s++ = *t++) != '\0')    ;}int main(){    int i = 3;    char a[] = "abcdefg";    char *p;    //strcopy(p, a);    printf("%d\n",i);}
打印结果是3.
第二次,我把int i = 3;移动p指针下面定义:
#include <stdio.h>void strcopy(char *s, char *t){    while ((*s++ = *t++) != '\0')    ;}int main(){    char a[] = "abcdefg";    char *p;    int i = 3;    strcopy(p, a);    printf("%d\n",i);}
也得到了正确的结果。
于是我用C free对原来的程序进行调试。

找到变量i的内存地址,可知其存放的是00000003,也就是数字3。
接着我执行strcopy方法后,就出状况了:


结果表明字符串被拷贝到了变量i的内存地址处。我对i处内存的内容进行十六进制转十进制,64636261转十进制后正好是1684234849.也就是这个诡异的输出结果。
综合以上的分析,所得结果如下:
#include <stdio.h>void strcopy(char *s, char *t){    while ((*s++ = *t++) != '\0')    ;}int main(){    int i = 3;    //定义int型变量i,分配内存空间,并赋值    char a[] = "abcdefg";    char *p;    //定义指针p,并为初始化指针的位置,在此程序中p默认指向了i的地址    strcopy(p, a);    printf("%d\n",i);}
现在真相大白了,不过任然让我疑惑的在指针p被定义的时候,p的默认指向地址是否有规律可循呢?任旧是个疑问,还请看到这篇文章的各位童鞋指点一二。
不过这个程序本来就是写的有问题,C语言的内存分配果然很容易出错(⊙o⊙)…
我想正确的程序应该是这样的...
#include <stdio.h>void strcopy(char *s, char *t){    while ((*s++ = *t++) != '\0')    ;}int main(){    int i = 3;    char a[] = "abcdefg";    char *p = (char *)malloc(sizeof(a));    //给指针分配新的内存空间    strcopy(p, a);    printf("%d\n",i);}
另外,搜索了下,函数malloc()和函数calloc() 的主要区别是前者不能初始化所分配的内存空间,而后者能。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表