指针赋值
时间:2010-10-19 来源:tianchunlong
先看一个程序,其实这是我编的一个不算小的程序里面的片断[pian duan],把曾经遇到的问题[wen ti]写出来:
#include<stdio.h>
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 <stdio.h>
#include <malloc.h>
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 <stdio.h>
#include <malloc.h>
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 <stdio.h>
#include <malloc.h>
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”,呵呵。