Chinaunix首页 | 论坛 | 博客
  • 博客访问: 864473
  • 博文数量: 149
  • 博客积分: 3671
  • 博客等级: 中校
  • 技术积分: 1701
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-03 16:52
文章分类

全部博文(149)

文章存档

2011年(57)

2010年(92)

分类: C/C++

2010-10-19 09:25:10

先看一个程序,其实这是我编的一个不算小的程序里面的片断[pian duan],把曾经遇到的问题[wen ti]写出来:

#include

int main(void)
{
char *a;
//a=(char *)malloc(20);
a=gets(a);
//scanf("%s",a);
//getchar();
puts(a);
getchar();
return 0;   
}

这个是我在windows下面调试[tiao shi]的一个程序,用的是dev c++ 4.9 ,编译[bian yi]是没有问题[wen ti]的,运行[yun hang]的时候就是直接出现windows特有的垃圾界面[jie mian],“工程1.exe 遇到问题[wen ti]需要关闭。我们对此引起的不便表示抱歉。”,就是叫你关了他。

分析之:其实把这个程序拿到linux下面的gdb一下就可以晓得运行[yun hang]到gets的时候,就会告诉你segments fault,很简单程序所用的数据[shu ju]段出了问题[wen ti],cplus里面其实也降到过,就是说没有初始化[chu shi hua]的指针[zhi zhen]不要赋值[fu zhi],段出现了覆盖[fu gai]的问题[wen ti],因为指针[zhi zhen]在没有初始化[chu shi hua]的时候,他是没有一个明确的地址[di zhi]的,你要是直接赋值[fu zhi]就会导致指针[zhi zhen]地址[di zhi]与其他的程序所占的地址[di zhi]的冲突[chong tu],最后就会出现段错误[cuo wu]。

解决方法[fang fa]:

把指针[zhi zhen]化成数组[shu zu],*a改成a[],我不喜欢用数组[shu zu],所以我用第二种方法[fang fa],给指针[zhi zhen]分配[fen pei]地址[di zhi]:

malloc就可以轻松的解决这个问题[wen ti]。

今天再补充一点:

malloc是动态[dong tai]的分配[fen pei],地址[di zhi]并不固定的,而数组[shu zu]在定义和初始化[chu shi hua]的时候就已经固定了,可以看一个程序:

#include
#include
int main(void)
{
 char *p="asdfasdf";
 char *q;
 q=(char *)malloc(20);
 q=p;
 printf("%s\n",p);
}

p的地址[di zhi]还是可以赋给q的,即便没有malloc分配[fen pei],初始化[chu shi hua]的时候就应该知道,指针[zhi zhen]的地址[di zhi]其实也算是动态[dong tai]的,比如这么定义和换地址[di zhi]:

#include
#include
int main(void)
{
 char *p="asdfasdf";
 char *q="ddddddddd";
 //q=(char *)malloc(20);
 p=q;
 printf("%s\n",p);
}
仍然可以的。

但是数组[shu zu]就不可以了,因为他的地址[di zhi]开始申明和赋值[fu zhi]的时候,就已经固定了,不可以变了的。

#include
#include
int main(void)
{
 char p[20]="asdfasdf";
 char q[20];
  p=q;
 printf("%s\n",p);
}

编译[bian yi]的时候会报错,D:\hehe\hehe\zhi\zhi.cpp(8) : error C2106: '=' : left operand must be l-value。

呵呵记得就行了。

但是有一点,char *p可以直接在定义的时候给值,比如char *p=“asdf”,或者char *p;p=“asdf”;这个其实是一种绑定[bang ding]的方法[fang fa],动态[dong tai]的吧。

但是下面这样就不可以了,char *p;scanf("%s",p);因为p的位置[wei zhi]不确定的,得在scanf("%s",p);之前malloc或者new一下。

char 型指针[zhi zhen]可以直接给字符[zi fu]串[zi fu chuan],但是int型的就不可以啊,比如int *p=123;就是不对了,这样吧,int *P;再malloc或者new一下一个确定的地址[di zhi],然后就*p=123就可以了。

int赋值[fu zhi]是给*p=123,而char型的就是给首地址[di zhi]p=“asdf”,呵呵。

阅读(3764) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-19 16:12:08

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com