第一题:
void GetMemory(char* p) {
p = (char*)malloc(100);//内存泄露
}
void Test(void) {
char* str = NULL;
GetMemory(str);//传值调用,出了这个函数,开辟的空间被销毁,str仍然是NULL
strcpy(str, "hello world");//无法打印,因为str是NULL,对空指针解引用,程序会崩溃
printf(str);
}
第二题:
char* GetMemory(void) {
char p[] = "hello world";
return p;//返回p数组的首元素地址
}
void Test(void) {
char* str = NULL;
str = GetMemory();//str接受p数组的首元素的地址,但是,出来这个函数p数组被销毁,所以str现在是野指针
//返回栈空间地址问题
printf(str);
}
第三题:
void GetMemory(char** p, int num) {
*p = (char*)malloc(num);//对二级指针解引用,拿到str的地址,开辟100个空间
}
void Test(void) {
char* str = NULL;
GetMemory(&str, 100);//传址调用
strcpy(str, "hello");
printf(str);//空间开辟成功,能打印出hello
//error,没有对开辟的空间释放
//free(str)
//str=NULL
}
第四题:
void Test(void) {
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);//忘了把str=NULL
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}