0
点赞
收藏
分享

微信扫一扫

动态内存相关经典面试题

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//(1):以下代码有什么问题:

//void GetMemory(char* p)
//{
// p = (char*)malloc(100);
//}
//void Test(void)
//{
// char* str = NULL;
// GetMemory(str);
// //1、str以值传递的形式给p, p是GetMemory的形参,只在函数内部有效,
// //函数返回之后,动态开辟的内存没有释放并且无法找到,所以会造成内存泄漏
//
// strcpy(str, "hello world");
// //2、程序崩溃, 空指针无法被赋值,但可以被赋址之后再赋值
// printf(str);//这样表达没错
//}
//int main()
//{
// Test();
// return 0;
//}


//改正(1):方法1:
//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;
//}


//改正(1):方法2:
//char* GetMemory(char* p)
//{
// p = (char*)malloc(100);
// return p;
//}
//void Test(void)
//{
// char* str = NULL;
// str=GetMemory(str);
// strcpy(str, "hello world");
// printf(str);//这样表达没错
//
// free(str);
// str = NULL;
//}
//int main()
//{
// Test();
// return 0;
//}


//(2):以下代码有什么问题:
//char* GetMemory(void)
//{
// char p[] = "hellow world"; //栈区
// return p; //函数返回时,p被销毁
//}
//void Test(void)
//{
// char* str = NULL;
// str = GetMemory();//造成非法访问
// printf(str);
//}
//int main()
//{
// Test();
// return 0;
//}


//(3):以下代码有什么问题:
//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;
//}


//(4):以下代码有什么问题:
void Test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str); //释放空间后,str变为野指针,并不会把str置为NULL
//改:
str=NULL;
if (str != NULL)
{
strcpy(str, "world");
printf(str);//已经释放了,现在是非法访问
}
}
int main()
{
Test();
return 0;
}

举报

相关推荐

0 条评论