一个网友的问题,有兴趣改错么?
问题的原始描述,貌似一个面试的问题,问以下程序错在何处,涉及到哪些概念,如何修正?
#include <stdio.h>
void display(char *); //注意形参为指针类型
main()
{
char *str=NULL;
display(str); //注意实参也是指针变量,与形参类型匹配,注意参数传递的单项值传递特性
}
void display(char *str)
{
str=(char *)malloc(100); //形参是局部变量,该值被修改
str="sdgjjsk"; //形参值再度被修改,指向字符串常量,使得上句空间丢失
printf("%s",str); //输出所指向的字符串常量内容
}
答案每天透露一点点,直到彻底放出。
提示1:注意display函数的形参和实参,采用了什么传递形式?
提示2:程序加了注释,应该没有问题了
改正的纯C版:
#include <stdio.h>
//#include <stdlib.h>
void display(char **); //注意形参为指针类型
main()
{
char *str=NULL;//=(char *)malloc(100);
display(&str); //注意实参也是指针变量的地址,注意参数改为了地址传递
printf("%s\n",str); //返回主调函数,再次输出内容,检验被修改的结果
}
void display(char **str)
{
*str="sdgjjsk"; //形参值被修改,但由于参数采用地址传递,被修改的结果能够在主调函数中看到影响
printf("%s\n",*str); //输出所指向的字符串常量内容
}
有人愿意奉献个使用引用传递参数的版本么?