C语言的函数参数问题看似简单, 其实有内涵?? 400 报错
void change(int *a)
{
a = malloc(sizeof(int));
(*a) = 168;
}
int* change2()
{
int *a = malloc(sizeof(int));
if (a) {
(*a) = 168;
return a;
}
return NULL;
}
我这样子用
int *p = NULL;
change(p);
printf("%d\n", (*p)); // error, segment fault
以下是正确的,
int *p = NULL;
p = change2();
printf("%d\n", (*p));
为什么第一个函数无论怎样都会出错, segment fault, 错在哪里?
而第二个函数就是成功的? cgange2() 可以分配内存, 还可以改变它的值;
能否解释??
int *p = NULL; 声明后的到一个值为0的指针变量,
调用change(p)时,函数里的a是p的拷贝,值也为0,
a = malloc(sizeof(int));之后,a的值变成一个申请的地址,而p的值还是0,
函数返回时,指针变量a直接被释放,而p的值还是0,
也就是说你的p从开始到结束一直就是个空指针,你可以用printf("%p\n", p);放在各处打印看看p的值。
######解释的相当到位。######第一个形参不能改变实参的值 第二个在堆上分配内存 两个函数完全不同######果然很有内憨呐######有什么内涵?哈。基础概念没搞清楚而已。你先搞清楚,一个函数调用时,参数究竟是在干什么。哈。######在函数change内部用malloc分配堆内存,调用函数change后如果忘记使用free释放,很容易发生内存泄露。参数可以传一个指针,指针指向的数据会随着函数change的操作而改变:这个其实就是值传递还是地址传递的区别,如果改成void change(int *&a) ;你会发下就可以了
######这个其实就是值传递还是地址传递的区别,如果改成void change(int *&a) ;你会发下就可以了
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。