内存&传参 问题
一
char *GetMemory(void) //char型函数指针,返回值是一个地址
{
char p[] = "hello world"; //定义一个char型数组,里面存放了一个字符串
return p; // return &p[0]; 返回指针所指向的地址
} //运行至此,"hello world"被释放
int main()
{
char *str = NULL; //定义一个指针,并且让这个指针指向内存的最前端(0x0000 0000),str = NULL
str = GetMemory(); //str = &p[0]
printf("%s", str); //此时str所指向的地址里面是随机值
return 0;
}结果:输出结果不确定
二:
void GetMemory(char *p, int Num) //str传递过来的是NULL, 也就是p=NULL
{
p = (char *)malloc(sizeof(char) * Num);
}
int main()
{
char *str = NULL; //定义一个指针str,str = NULL
GetMemory(str, 100); //将NULL传递过去(传递的是一个值, NULL)
strcpy(str, "hello"); //不能将hello 传递进去,因为str没有空间,是个野指针
return 0;
}结果:不能执行strcpy(str, "hello") , 会发生段错误
知识点:
原型char strcpy(char dest , char * source)
运用strcpy()这个函数的时候,确保dest是指向一个空间。否则,运行strcpy()会发生段错误。
三:
void GetMemory(char **p, int num) // p = &str
{
*p = (char *)malloc(num); //*p = str,也就是说str指向了申请到的内存的首地址
}
int main()
{
char *str = NULL; // 定义一个char型指针str,str = NULL
GetMemory(&str, 100); //&str 取的指针str的地址
strcpy(str, "hello"); //把 hello 放进 str 所指向的内存里面
printf("%s", str);
free(str);
return 0;
}结果:正确输出hello
四:
int main(void)
{
char *str = (char *) malloc(100); //定义一个char型指针str,并申请100个字节的内存,让str指向这块内存的首地址
strcpy(str, "hello"); //把 hello 放进内存里面
free(str); //将str所指向的内存释放,但str仍然是指向这块内存的首地址,值还在
if(str != NULL) //条件成立
{
strcpy(str, "world");
printf("%s", str);
}
}结果:正确输出一个world
malloc()获取一块大小指定的可用的内存的使用权
free()释放对这个内存的使用权,