跟内存有关的笔试题

一、题目1

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;
}

二、题目2

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);//括号不加也行
}

如果接受了这个函数返回的地址,就会造成野指针问题。

三、题目3

int* f2(void)
{
    
    
	int* ptr;
	*ptr = 10;
	return ptr;
}

代码存在的问题:没有对ptr进行初始化,ptr里的是随机值,是野指针,对ptr解引用,造成非法访问。

四、题目4

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;
}

五、题目5

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);
	}
}

猜你喜欢

转载自blog.csdn.net/zhanlongsiqu/article/details/129780392
今日推荐