1. [case1] 常见(应该在在某个笔试面试中常见),自已写项目时,也会遇到使用或者实现这样的一个接口分配内存
1.1 error现象
//C风格
void get_memory(char *p,int len)
{
p = (char *)malloc(len);
return ;
}
int main()
{
char *pstr = NULL;
get_memory(pstr);
strcpy(pstr,"hello world!");//在这里就会崩了
printf("str =%s\n",pstr);
return 0;
}
[分析说明]
以上程序会崩溃,没有输出;在哪里崩了,上面有说明,为什么会崩掉,为什么会这样,没有达到内存分配?【很多网上说得很笼统,怎么p在函数完了,就被释放了,这样说明显不是很清楚】
1. 地址传递的本质就是值传递,编译器的处理抽象本质是一致的。当pstr作为实参传递给getMemory()时,实质是把pstr的副本pstr1传递给getMemory(),由于pstr1指向的char 变量值是一样的,所以pstr1与pstr指针值是一样的即同一个地址(share_ptr?这里还有点小疑惑,指针变量的临时变量的副本,地址都是一样的吗?如果不一样,那既要重新生成新的地址新的变量,那这样的话动作也太大了,想想编译器也不会这样的),则getMemory()中对pstr1(pstr的副本)进行操作,根本就不会影响到pstr,当然pstr1是可以影响它们指向的变量值的。
[小结]
int val =100;
int *p =&val;
int **p1 =&p;
要理清,地址传递的本质,也是值传递,指针在函数中作形参时,指针p可以影响变量val即要想改变val,则传p,指针的指针即p1可影响p即要想改变p,则传p1;
按照小结的结论,正确的写法:
void get_memory(char **p,int len){
//用小结上的变量来说明:在上面的case1中我们想改变val,对*p操作即可,而不是操作p;
//那么在这里同理,我们想到val的指针p进行改变,我们直接改变*p1,而非p1
//故如下:上面回答为什么不用 p = (char *)malloc(len);
*p = (char *)malloc(len);
return;
}
后面,没了...