动态内存函数经典笔试题(试题篇2)

广而告知: 博客写得好,Emoji要选好!!🎵 🎶 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢
写博客是知识是巩固和温习,所以在这个信息爆炸的时代,每个人每天都要接收很多讯息,你的记忆是有限的,知识也是有限的,时间也是有限的,既然如此,那是时候磨亮我的五十米大刀了。 你很强,上天揽月你不行,你很强,下海捞鱼总行吧!

💀☠💩🤡👹👺👻👽👾🤖 -->渴望知识!!!
 

目录

经典题1:作用域的有效性。

1.2 那有没有改进的地方呢?

经典题2:开辟的内存没有free以及该空间没有将其指向空指针(NULL)

2.1 分析:

2.2 那么如何修改呢?

经典题3:考察的是内存的释放,释放之后就是野指针,如果此时再对该空间进行访问,那么就是非法访问。

3.1分析:

3.2 那这道题需要怎么修改呢?


经典题1:作用域的有效性。

函数内的局部变量的生命周期从进入作用域开始,出函数后生命周期结束。

这个题会输出什么结果呢?

-->很显然,这个代码是实现不了,我们想要达到的目的。

1.1分析整个过程:

因为,Getmory函数执行完之后,数组p[]里面的存放的”hello world"就被销毁了,内存释放,空间还给了操作系统,而p还记住了这个地址,而这个地址指向的内容可能会被修改。

此时的p就是一个野指针了。

而此时str从Getmory获取回来的返回值还是p的这个地址,当一个地址传递给printf(str)的时候,那么当printf(str)进行解引用的时候,就是对p的非法访问,就会出现程序崩溃。

#include <stdio.h>
#include<stdlib.h>
char* Getmory(void)
{
	char p[] = "hello world";
	return p;
}
void test(void)
{
	char* str = NULL;    //定义str初始化是一个空指针
	str = Getmory();
	printf(str);
}
int main()
{
	test();
	return 0;
}

1.2 那有没有改进的地方呢?

显然方法是有的:只要我们将地址传递过去就可以了,因为在计算机分配好的空间后,地址的固定的,因此地址指向的元素数据也是不变的,因此我们需要传递地址,而需要传递地址就需要使用指针的方法。 

#include <stdio.h>
#include <stdlib.h>
char* Getmory(char* p)
{
	p = "hello world";
}
void test(void)
{
	char* str = NULL;
	str = Getmory(str);
	printf(str);
}
int main()
{
	test();
	return 0;
}

经典题2:开辟的内存没有free以及该空间没有将其指向空指针(NULL)

#include <stdio.h>
#include <stdlib.h>

void Getmory(char** p, int num)
{
	*p = (char*)malloc(num);  
}

void test(void)
{
	char* str = NULL;
	Getmory(&str, 100);
	strcpy(str, "hello");
	printf(str);
}

int main()
{
	test();
	return 0;
}

2.1 分析:

void test(void)
{    

     char* str = NULL;  //定义一个字符指针,并初始化指向空指针(指针一定要初始化)
    Getmory(&str, 100); //通过取出str的地址,以及开辟100个内存空间
    strcpy(str, "hello");  //将hello拷贝到str开辟的100个内存空间,
    printf(str);//将str空间的字符打印出来

//...正常这里调用完之后,需要释放空间,但是这里没有

}

void Getmory(char** p, int num)    //因此str取出的是地址,所以这是使用char** p来指向地址。
{
    *p = (char*)malloc(num);      //*p通过解引用,取出str的地址,也就是相当于str,并通过malloc开辟指向str起始地址的空间
}

那么通过以上的分析,我们可以发现,这个程序是可能存在内存泄露的,因为使用完之后,mallo开辟的空间没有被销毁。 

2.2 那么如何修改呢?

这里也很简单,只需要在打印的后面,锦绣free(str)进行释放就可以了。 

#include <stdio.h>
#include <stdlib.h>

void Getmory(char** p, int num)
{
	*p = (char*)malloc(num);  
}

void test(void)
{
	char* str = NULL;
	Getmory(&str, 100);
	strcpy(str, "hello");
	printf(str);
	free(str);
	str = NULL;
}

int main()
{
	test();
	return 0;
}

经典题3:考察的是内存的释放,释放之后就是野指针,如果此时再对该空间进行访问,那么就是非法访问。

#include <stdio.h>
#include <stdlib.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;
}

3.1分析:

void test(void)
{
    char* str = (char*)malloc(100); 
    strcpy(str, "hello");
    free(str);   //释放空间

//.....    但是此刻没有将str的空间指向空指针 str=NULL;因此当free(str)之后,str就成为了一个野指针。 
    if (str != NULL)      //由于str已经通过free(str)释放,但是并没有指向空指针,但是这个if条件满足
    {
        strcpy(str, "world");     //当strcpy 想将world拷贝进去str的时候,也就是往str里面写东西,这个时候由于str是野指针,所以这个操作就成为非法访问内存空间。 
        printf(str);
    }
}

3.2 那这道题需要怎么修改呢?

我们需要再free函数后面加上

str = NULL; //将str指向空指针

#include <stdio.h>
#include <stdlib.h>
void test(void)
{
	char* str = (char*)malloc(100);
	strcpy(str, "hello");
	free(str);
	str = NULL;
	if (str != NULL)
	{
		strcpy(str, "world");
		printf(str);
	}
	else
	{
		printf("hello world");
	}
}
int main()
{
	test();
	return 0;
}

最后,请各位发财的金手指,帮忙点点赞和关注!

💁‍♂️💁‍♀️🙋🙋‍♂️🙋‍♀️🧏🧏‍♂️一赞三连🧏‍♀️🙇🙇‍♂️🙇‍♀️🤦🤦‍♂️🤦‍♀️🤷🤷‍♂️🤷‍♀️

💁‍♂️💁‍♀️🙋🙋‍♂️🙋‍♀️🧏🧏‍♂️一赞三连🧏‍♀️🙇🙇‍♂️🙇‍♀️🤦🤦‍♂️🤦‍♀️🤷🤷‍♂️🤷‍♀️

💁‍♂️💁‍♀️🙋🙋‍♂️🙋‍♀️🧏🧏‍♂️一赞三连🧏‍♀️🙇🙇‍♂️🙇‍♀️🤦🤦‍♂️🤦‍♀️🤷🤷‍♂️🤷‍♀️

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值