void GetMemory(char* p)
{
p = (char*)malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(str);
strcpy(str, "hello word");
printf(str);
}
代码存在的问题:
1、调用GetMemory函数的时候,str的传参为值传递,p是str的临时拷贝,所以在GetMemory函数内部动态开辟空间的地址存放在p中的时候,不会影响str的值。调用完GetMemory函数之后,str依然为NULL指针。这会使strcpy函数调用失败,原因是strcpy函数对NULL指针解引用。
2、GetMemory函数中malloc申请的空间没有释放,造成内存泄漏。
3、malloc的返回值最好判断一下,因为malloc有可能开辟内存空间失败返回空指针NULL(但在这个题里面这不是核心的缺陷)。
改法1:返回p的值(因为malloc在堆区申请的空间出了函数是不销毁的);释放内存,再将指针置空。
char* GetMemory()
{
char* p = (char*)malloc(100);
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory();
strcpy(str, "hello word");
printf(str);
free(str);
str = NULL;
}
改法2:传址调用,在调用GetMemory函数时通过指针改变GetMemory函数外部的str的值;释放内存,再将指针置空。
void GetMemory(char** p)
{
*p = (char*)malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str);
strcpy(str, "hello word");
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);
}
代码存在的问题:返回栈空间地址问题,GetMemory函数内部创建的数组是临时的,虽然将数组的起始地址返回给了str,但是数组的内存出了GetMemory函数之后就被回收了,而str依然保存着数组的起始地址,这时如果printf使用了str,就会造成非法访问,因为str是野指针。
有返回栈空间地址问题的代码:
int* f1(void)
{
int x = 10;
return (&x);//括号不加也行
}
如果接受了这个函数返回的地址,就会造成野指针问题。
int* f2(void)
{
int* ptr;
*ptr = 10;
return ptr;
}
代码存在的问题:没有对ptr进行初始化,ptr里的是随机值,是野指针,对ptr解引用,造成非法访问。
void GetMemory(char** p, int num)
{
*p = (char*)malloc(num);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
代码存在的问题:
1、没有对申请的内存空间进行释放,要用free进行内存释放,然后将指针置空。
2、malloc的返回值最好判断一下,因为malloc有可能开辟内存空间失败返回空指针NULL(但在这个题里面这不是核心的缺陷)。
修改:用free将内存空间释放,然后将指针置空。
void GetMemory(char** p, int num)
{
*p = (char*)malloc(num);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
free(str);
str = NULL;
}
void Test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
代码存在的问题:
1、用free将内存空间释放之后,没有将指针置空。这时str为非空指针,进入if语句,由于str指向的内存空间已经还给操作系统,所以str成为野指针,这时在strcpy中使用str,造成非法访问。
2、malloc的返回值最好判断一下,因为malloc有可能开辟内存空间失败返回空指针NULL(但在这个题里面这不是核心的缺陷)。
修改:在free(str);之后将指针置空。
void Test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
str = NULL;
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}