阅读如下几段程序,指出哪几段程序有问题,并说明有什么问题??
a)
int* f1(void)
{
int x=10;
return (&x);
}
问题:非法访问内存
分析:变量x属于栈区,当f1函数调用结束时,栈区的内存会自动还给操作系统,所以x的那块地址已经是未知的,所以再将其地址作为函数的返回值就会存在非法访问内存的问题
b)
int* f2(void)
{
int* ptr;
*ptr=10;
return ptr;
}
问题:非法访问内存(野指针问题)
分析:定义指针时没有给指针初始化,又紧接着给指针赋值,这会出现非法访问内存问题
c)
#include<stdio.h>
#include<string.h>
void GetMemory(char** p,int num)
{
*p=(char*)malloc(num);
}
void Test(void)
{
char* str=NULL;
GetMemory(&str,100);
strcpy(str,"hello");
printf(str);
}
int main()
{
Test();
return 0;
}
问题:内存泄漏
分析:忘记释放动态开辟的内存,导致内存泄漏。所以在打印完之后 free(str);str=NULL;
d)
#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,但非法访问内存(篡改动态内存区的内容)
分析:使用了一块已经被释放的内存str,这就是非法访问内存。并且free释放str指向的空间后,并不会把str置为NULL,所以if判断没有意义。所以当释放str之后应该将str置为空