广而告知: 博客写得好,Emoji要选好!!🎵 🎶 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢
写博客是知识是巩固和温习,所以在这个信息爆炸的时代,每个人每天都要接收很多讯息,你的记忆是有限的,知识也是有限的,时间也是有限的,既然如此,那是时候磨亮我的五十米大刀了。 你很强,上天揽月你不行,你很强,下海捞鱼总行吧!
💀☠💩🤡👹👺👻👽👾🤖 -->渴望知识!!!
目录
经典题2:开辟的内存没有free以及该空间没有将其指向空指针(NULL)
经典题3:考察的是内存的释放,释放之后就是野指针,如果此时再对该空间进行访问,那么就是非法访问。
经典题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;
}
最后,请各位发财的金手指,帮忙点点赞和关注!
💁♂️💁♀️🙋🙋♂️🙋♀️🧏🧏♂️一赞三连🧏♀️🙇🙇♂️🙇♀️🤦🤦♂️🤦♀️🤷🤷♂️🤷♀️
💁♂️💁♀️🙋🙋♂️🙋♀️🧏🧏♂️一赞三连🧏♀️🙇🙇♂️🙇♀️🤦🤦♂️🤦♀️🤷🤷♂️🤷♀️
💁♂️💁♀️🙋🙋♂️🙋♀️🧏🧏♂️一赞三连🧏♀️🙇🙇♂️🙇♀️🤦🤦♂️🤦♀️🤷🤷♂️🤷♀️