目录
第一题
1.分析
//问:以下程序运行test后的效果是什么?
void getmemory(char* p)
{
p = (char*)malloc(100);//问题一:形参传完之后并没有进行动态内存释放,导致内存泄漏
}
void test(void)
{
char* str = NULL;
getmemory(str);
strcpy(str, "hello world");//问题二:str是空指针,对空指针进行解引用会造成程序崩溃
printf(str);
}
int main()
{
test();
return 0;
}
2.代码修改
//修改后的程序
void getmemory(char** p)//接收指针变量的参数要用两颗*接收
{
*p = (char*)malloc(100);
}
void test(void)
{
char* str = NULL;
getmemory(&str);//传递str指针变量的地址,从而str存放的就是动态开辟的100字节的地址
strcpy(str, "hello world");
printf(str);
free(str);
str = NULL;
}
int main()
{
test();
return 0;
}
3.仿真运行
第二题
1.分析
//问:以下程序运行test后的效果是什么?
char* getmemory(void)
{
char p[] = "hello world";//p是一个局部数组,当程序运行走出getmemory函数,就会被销毁,将内存空间还给操作系统,里面的内容会被其它元素覆盖
return p;
}
void test(void)
{
char* str = NULL;
str = getmemory();//此时的str是野指针
printf(str);
}
int main()
{
test();
return 0;
}
本题错误比较低级且漏洞很大,对其修改没有意义,所以不必进行修改
第三题
1.分析
//问:以下程序运行test后的效果是什么?
void getmemory(char** p, int num)
{
*p = (char*)malloc(num);
}
void test(void)
{
char* str = NULL;
getmemory(&str, 100);
strcpy(str, "hello");
printf(str);//代码运行是合理的,可以成功的打印“hello”,但是没有进行动态空间的释放,可能会造成空间泄露
}
2.代码修改
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;
}
int main()
{
test();
return 0;
}
3.仿真运行
第四题
1.分析
//问:以下程序运行test后的效果是什么?
void test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);//经过释放后,str指向的空间已经还给操作系统了
if (str != NULL)
{
strcpy(str, "world");//此刻str是野指针,其指向的空间不能被操作,会形成非法访问
printf(str);
}
}
int main()
{
test();
return 0;
}
2.代码修改
void test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);//经过释放后,str指向的空间已经还给操作系统了
//修改
str = NULL;//free释放后将str置空
if (str != NULL)
{
strcpy(str, "world");//此刻str是野指针,其指向的空间不能被操作,会形成非法访问
printf(str);
}
}
int main()
{
test();
return 0;
}