首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于指针的几个题目解决方法

2012-06-01 
关于指针的几个题目1.void get(char *p){p(char *)malloc(100)}void main(){char *strNULLget(str)st

关于指针的几个题目
1.void get(char *p)
{
p=(char *)malloc(100);
}
void main()
{
char *str=NULL;
get(str);
strcpy(str,"hello world");
printf(str);
}
这个为什么会崩溃呢?str真的有没有作为实参传给p呢?


2.char* get()
{
char p[]="hello world";
return p;

}
void main()
{
char *str=NULL;
str=get();
printf(str);
}
这个不是说p为局部变量么,函数结束之后不就释放了么?为什么还会有输出呢?


3.char *get()
{
char *p="hello";
return p;
}
void main()
{
char *str=NULL;
str=get();
strcpy(str,"abc");
printf(str);
}

这个是为什么崩溃呢?


4.void get(char **p,int num)
{
*p=(char *)malloc(num);
}
void main()
{
char *str=NULL;
get(&str,100);
strcpy(str,"hello");
printf(str);
}

这是四个中唯一一个可以运行成功的。


不知道这四个程序 内在有什么样的联系呢?

[解决办法]
作为参数的指针问题。其实你修改的是指针的副本。
建议楼主看下我的C语言初学者的建议篇:

http://topic.csdn.net/u/20120319/15/0751ad00-bad3-481b-9f3a-fed7409cb9cc.html
[解决办法]
第一个程序,get函数并不会修改参入参数的值.调用完成后,str的值仍未NULL.故会出现问题。
改为如下代码就可以了。

char* get()
{
p=(char *)malloc(100);
}

void main()
{
char *str=NULL;
str=get();
strcpy(str,"hello world");
printf(str);
}

第二个程序,p是动态分配的,指向堆,而不是指向栈,函数get结束后,p的值仍然有效。

第三个程序,通常字面值,字符串常量,指向一个只读的数据写,你尝试将数据写入只读数据区,自然会出问题。

第四个程序,传入参数是指针的指针,他和程序1不一样,在这个程序中,函数指针str在函数get带调用结束后被修改为指向堆的指针,故可以正确工作。

热点排行