已有24702.8镜头还需要1835g吗

这题真是没节操我的做法更没節操,网上有的大神还用hash
一开始我先去用字母比较不会枚举,直接DFS第三个数据就T了
后来直接去比字符串每位的价值,过了
PS:没打开兩个文件,直接把字典打表我也是写过4000行代码的人啊

格式:DOC ? 页数:52页 ? 上传日期: 15:24:44 ? 浏览次数:1 ? ? 1000积分 ? ? 用稻壳阅读器打开

全文阅读已结束如果下载本文需要使用

该用户还上传了这些文档

一个由C/C++编译的程序占用的内存分為以下几个部分:

 1、栈区(stack):又编译器自动分配释放存放函数的参数值,局部变量的值等其操作方式类似于数据结构的栈。
 2、堆区(heap):一般是由程序员分配释放若程序员不释放的话,程序结束时可能由OS回收值得注意的是他与数据结构的堆是两回事,分配方式倒昰类似于数据结构的链表
 3、全局区(static):也叫静态数据内存空间,存储全局变量和静态变量全局变量和静态变量的存储是放一块的,初始化的全局变量和静态变量放一块区域没有初始化的在相邻的另一块区域,程序结束后由系统释放
 4、文字常量区:常量字符串就是放在这里,程序结束后由系统释放
 5、程序代码区:存放函数体的二进制代码。

1.1 自动释放内存无需码农操作

  我们在程序中所定义的定義的局部变量int、局部数组等都是存储在栈空间中栈空间具有一个鲜明的特点:函数内定义的变量出了函数范围,其所占用的内存空间自動释放但是,栈空间的尺寸有最大限制不适合分配大空间使用

  所以,因为栈空间出了函数范围就释放所以不适合要给其他地方使用的内存需求。其最大的好处就在于:不用程序员手动释放内存

1.2 不要把局部变量的指针做为返回值返回

  首先,我们来看看下面┅段代码其中getData函数返回了一个int数组类型的指针,而getData2函数返回了另一个int数组类型的指针:

  我们在main函数中首先调用getData函数看看能否取得nums數组的前三个元素:

  运行结果如下图所示,我们发现是OK的原来可以将局部变量的指针作为返回值返回呢!

  但是,如果我们在调鼡getData函数之后又调用了getData2函数呢,这时还能正确地打印nums数组吗看看下面的执行顺序:

  在打印之前,我们又执行了getData2函数那么运行结果呢,看看下图吧:

  这时突然觉得,忧伤爆了!刚刚都还是好的啊!

  那么问题来了,这是为什么呢我们刚刚提到了,栈是由系统自动分配和释放函数内部的局部变量的生命周期就只是在函数周期内,只要函数执行完毕那么其内部的局部变量的生命周期也就結束了。于是当我们执行完第一句代码后,nums指针所指向的数组的那一块内存区域可能就已经被释放了但是数据还未清理也就是还留在那儿。但是当我们执行完第二句代码后,在getData2函数中又定义了一个数组aaa它又将刚刚释放的栈空间内存占用了,于是nums所指向的这块区域就昰aaa了当执行完第二句代码,aaa又被释放了但是其数据还在那里并未清除,也就是我们前面几篇提到的脏内存区域所以,最后显示的就昰8,7,6而不是1,2,3了

2.1 技术控都喜欢开手动档汽车

  刚刚提到的栈空间最大的优点就是栈空间出了函数范围就释放,不需要程序员手动释放就潒自动挡汽车一样,都不用我们去加减档变速但是,如果我们向自己控制内存的分配呢这时候,就可以使用堆空间来存储堆空间可鉯存储栈空间无法存储的大内存。这里我们可以借助malloc函数在堆空间中分配一块指定大小的内存,用完之后调用free函数及时释放内存。

  需要注意的是:在malloc函数中需要指定要分配的内存所占用的字节大小

2.2 函数返回指针的几种解决办法

  (1)在方法内malloc,用完了由调用者free

  这里我们可以结合malloc和free来解决我们在栈空间中所遇到的问题重写上面的代码如下:

// 不要忘记释放内存

  这里我们将所有要返回的指針都改为了使用malloc动态分配的,在main函数中调用free将内存手动释放掉来看看运行结果:

  这下输出的还是getData函数返回的指针所指向的内存区域嘚数据,没有出现交叉影响完美!

  (2)把局部变量定义为static

  由本文开篇可知,除了栈空间和堆空间还有一块全局区,它直到程序结束后才会释放

  But,需要注意的是:不适合于多线程调用如果想保存返回内容,你需要调用者尽快复制一份

  (3)(推荐)甴调用者分配内存空间,只是把指针发给函数函数内部把数据拷贝到内存中

  这里怎么来理解呢,也就是三个步骤第一步:由调用鍺分配内存空间;第二步:把指针传递给函数;第三步:函数内部把数据拷贝到内存中。下面我们通过一个小案例:从文件名分析文件名囷扩展名来看看这三个步骤怎么来实现。

// Step3:函数内部把数据拷贝到内存中
 //ptr移动到了字符串的结尾再把ptr移动到"."的位置
 // 两个指针相减表示两個指针相隔的元素的个数
 // Step1:由调用者分配内存空间
 // Step2:只是把指针传递给函数
 
 

  这种方法避免了函数返回指针,程序员手动分配的内存都是在棧空间中然后函数内部处理后再将经过逻辑处理后的数据存储到栈空间中的指定区域内,最后main函数中再访问修改后的内存区域这里的運行结果如下图所示:

  虽然这个文件名有点邪恶,但是功能还是完成了哎哟,不错哦!

  如鹏网《C语言也能干大事(第三版)》

我要回帖

更多关于 35g大概多少 的文章

 

随机推荐