C语言二级指针字符串与malloc的陷阱
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
// 通过调用没有返回值的函数来改变实参str的值,
void getMemory(char* *p) //形参是指针的指针
{
*p=(char*)malloc(100);
}
int main(void)
{
char* str =NULL;//空指针
getMemory(&str); //这个时候 str就不是空指针,指向堆区开辟的区域 实参也应该是指针的指针 所以&str
// 通过调用没有返回值的函数,就要改变实参str的值,应该使用传址的方式。因为str本身就是一个指针,所以&str是一个二级指针。
strcpy(str,"hello");
printf("%s",str);
return 0;
}
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
void getMem(int* p)
{
p=(int*)malloc(sizeof(int));
*p=5;
}
int main(void)
{
int a=1;
int* p1=&a;
getMem(p1);
printf("a=%d\n",a);//这里还是1
// 代码的逻辑是:定义指针变量p1,p1指向main函数中的变量a,
// 通过调用getMem函数给变量a通过传址的方式改变实参a的值,改为5,
// 但输出的结果为1,说明变量a的值并没有改变。原因在于错误地使用了malloc。
return 0;
}
解析:p=(int*)malloc(sizeof(int));需要屏蔽掉上面这句话,因为这里把参数传递进来之后,传递进来的是main函数中a的地址,但是这个语句又让指针变量p指向了一个新开辟的空间,p已经不再指向a了,所以下面*p=5起到的作用只是把malloc出来的那块内存空间赋值为5,但此时*p中存放的已经不再是a的地址了。