- 函数传参方式是值传递
形参其实也是个局部变量,出了函数就没了,所以怎么赋值怎么修改都没用。
#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;
}