题目一
#include<stdio.h> void GetMemory(char* p) { p = (char*)malloc(100); } void Test(void) { char* str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } int main() { Test(); return 0; }
结果:
程序崩溃
分析:
1.在给GetMemory函数传参的时候用的是一级指针,是形参,形参是实参的一份临时拷贝
只能在GetMemory函数内部有效。当GetMemory函数执行完后,str仍然是一个空指针,对空指针进行strcmpy自然会程序崩溃。
2.动态开辟的内存尚未释放,造成内存泄漏
改正:
方法一:
#include<stdio.h> void GetMemory(char** p) { *p = (char*)malloc(100); } void Test(void) { char* str = NULL; GetMemory(&str); strcpy(str, "hello world"); printf(str); free(str); str=NULL; } int main() { Test(); return 0; }
方法二:
#include<stdio.h> char* GetMemory(char* p) { return p = (char*)malloc(100); } void Test(void) { char* str = NULL; str=GetMemory(str); strcpy(str, "hello world"); printf(str); free(str); str = NULL; } int main() { Test(); return 0; }
题目二
#include<stdio.h> char* GetMemory(void) { char p[] = "hello word"; return p; } void Test(void) { char* str = NULL; str=GetMemory(); printf(str); } int main() { Test(); return 0; }
结果:
输出随机值(非法访问空间)
分析
返回的是栈空间的,当函数GetMemory执行完后,此部分的空间内容已被释放,原本存放的hellow world 已被释放了,所以会出现非法访问空间的问题。
题目三
#include<stdio.h> char* GetMemory(char**p,int num) { *p = (char*)malloc(num); } void Test(void) { char* str = NULL; str=GetMemory(&str,100); strcpy(str, "hello"); printf(str); } int main() { Test(); return 0; }
结果;
hello (存在内存泄漏)
分析:
忘记释放动态开辟的内存,导致内存泄漏。
题目四
#include<stdio.h> void Test(void) { char* str = (char*)malloc(100); strcpy(str, "hello"); free(str); if (str != NULL) { strcpy(str, "world"); printf(str); } } int main() { Test(); return 0; }
结果:
world (存在很大问题)
分析:
被释放的空间又再一次被使用。
注释:
free释放ptr指向的空间后,并不会把str置为NULL,要自行将其置为空指针。