题目一:
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
仔细观察,GetMemory函数对于str来说进行的是传值调用,并不能改变str的值 。
因此str在函数结束之后仍然是NULL 那么再用str对其引用 就会出现错误。
同时忽略了释放内存,会造成内存泄漏
修改:
void GetMemory(char** p)
{
*p = (char*)malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str);//函数并没有改变str的值 传值操作
strcpy(str, "hello world");//这里对NULL进行引用
printf(str);
//释放
free(str);
str = NULL;
}
题目二:
经典问题:返回栈空间地址
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
创建的char类型的p[]数组是创建在栈上的局部变量,那么返回他的地址之后,局部变量就销毁了。
再引用销毁局部变量的地址 就会造成非法访问。
也没有进行内存空间的释放,造成内存泄漏。
题目三:
void GetMemory(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
这一个修改了题目一中的传值操作的问题 ,采用了二级指针,一次返回值这里没有问题。
但是仍然忽略了内存空间的释放,造成内存泄漏
题目四:
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, "hello");
free(str);
if(str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
该题目首先没有对str进行判断,如果动态内存开辟不成功,就会出现解引用NULL的问题
再有就是除了在对动态内存空间释放后,应当及时将指针置空,否则会出现非法访问
修改:
void Test(void)
{
char* str = (char*)malloc(100);
if (str == NULL)
{
return;
}
strcpy(str, "hello");
free(str);
str = NULL;
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}