指针参数是如何传递内存的
如果函数的参数是一个指针的话,不要用它去申请动态内存!
如下例子:并未达到预期的期望:
#include<stdio.h>void GetMemory(char *p,int num){p = (char *)malloc(sizeof(char)*num);}int main(void){char *str = NULL;GetMemory(str,100);//str 仍然为NULLstrcpy(str,"hello");return 0;}
GetMemory(char *p,int num)的执行过程:
编译器总是会为函数的每个形参制作临时副本,指针参数p的副本就是_p,编译器使_p = p;
函数体内对_p内容的修改就是对p内容的修改。因此指针既为输入参数又为输出参数。
在本例中_p申请了新的内存,只是把_p的内存地址改变了,但是p的内存地址未变!所以
解决办法有两个:
一是;用指向指针的指针去申请动态内存:
#include<stdio.h>//=====//执行过程:void GetMemory(char **p,int num){*p = (char *)malloc(sizeof(char)*num);}int main(void){char *str = NULL;GetMemory(&str,100);//
strcpy(str,"hello");return 0;}
最简单的就是利用return
#include<stdio.h>//=====char *GetMemory(void){char *p = "hello";return p;}int main(void){char *str = NULL;str = GetMemory();return 0;}
书本中说道:设计概念错误!
char *p = "hello";
"hello"是常量字符串 存储在静态存储区!在其生命周期内恒定不变!不可修改!