- 函数传参方式是值传递
形参其实也是个局部变量,出了函数就没了,所以怎么赋值怎么修改都没用。
#include <bits/stdc++.h>
using namespace std;
void A(char *p){
p=(char*)malloc(100);
}
int main(){
char* str=NULL;
printf("%x\n",str);
//str仍然是空指针,函数不能改变形参。
A(str);
printf("%x\n",str);
return 0;
}
- 换成二级指针
传递一个二级指针,二级指针指向一个一级指针,所以可以修改。
#include <bits/stdc++.h>
using namespace std;
void A(char **p){
*p=(char*)malloc(100);
}
int main(){
char* str=NULL;
printf("%x\n",str);
A(&str);
printf("%x\n",str);
return 0;
}
- 返回数组/返回指针
A函数返回一个局部变量,s指向的内存地址已经清空了,所以得到一个空指针。
B函数返回的指针还在,但是由于函数已经返回,栈被清空,所以指针指向的内存可能被其他程序所使用。
这里涉及到字符数组和字符指针的区别:- 如果是char* s="Hello",字符串常量"Hello"是存放在常量区,而指针s是作为局部变量存放在栈区,s的值就是字符串所在内存的地址。
- 如果是char s[]="Hello",这里的字符数组和s这个变量都是存储在栈区。
- 常量区的字符串常量是不能修改的。
#include <bits/stdc++.h>
using namespace std;
char* A(){
char s[]="Hello World";
return s;
}
char* B(){
char* s="Hello World";
return s;
}
char* C(){
static char s[]="Hello World";
return s;
}
int main(){
char* a=NULL;
printf("%x\n",a);
a=A();
printf("%x\n",a);
// printf("%s\n",a);
char* b=NULL;
printf("%x\n",b);
b=B();
printf("%x\n",b);
// printf("%s\n",b);
char* c=NULL;
printf("%x\n",c);
c=C();
printf("%x\n",c);
printf("%s\n",c);
return 0;
}
原文链接: https://www.cnblogs.com/zxcoder/p/12236975.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/325284
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!