c语言内存优化
‘壹’ 用c语言怎样无限开辟内存、或编一个通过无限开辟内存,处理大量数据的程序来让电脑死机。
生成大链表,最好里面用大节点,这样可以加速内存的耗尽,分配时用calloc申请内存,malloc也可以,生成中的节点中多用凯岁指针,然后指针不指空值(这样就有可能指到系统区去),这里的用三个do{}while(1)来实现颤喊,一个是生成链表,一个是用链表节点值做任意的运算——这两个是同一等级的,还有一个是最外层。这里一定是要用到break的……思路是这样的,你也是这样想的吧,想必我说的就是你想的,只是你在编译是总是不得过,对啊,呵呵,别傻啦,我们能找到的编译器是要做安全性检查的(不光是一些语法的)
除非,你在写之前,自己先写一个编译器来……或者你茄孙野已经找到了这样的工具
‘贰’ 求教C语言内存过剩的解决办法!!
首先我想说一下new和delete不是C语言里面的东西,那是C++里面的。还有就是for(int
i=0;i<a;i++)这段代码也不是C语言的,这个是C++的,C语言的应该是
int
i;
for(i=0;
i<a;
i++)
现在给您讲一下动态分配方法,代码如下
#include
<stdio.h>
#include
<stdlib.h>
void
main()
{
int
a,
sum=0;
printf("蠢配请输入学科数目:");
scanf("%d",
&a);
int*
b
=
(int*)malloc(a*sizeof(int));
//动态分配内存空间
printf("请输入学科数目:");
int
i;
for(i=0;
i<a;
i++)
{
scanf("%d",
&b[i]);
sum
+=
b[i];
}
printf("该学生总成绩:%d\n",
sum);
free(b);
//释放分配的内存空间
}
解释:malloc函数用于分配内存空间,在这里您输入的为a个学科,所以要用到a个整数用来存储各科成绩,而每一个整数占用内存为sizeof(int),总共有a个整数猛散,所以分配a*sizeof(int)个字节的空间,程序运带知指行完毕之后需要释放分配的内存空间,用free()函数释放,否则程序退出会造成内存泄露。
谢谢采纳。
‘叁’ C语言编译,如何减少内存
用时再申请内存,用完了就放掉,要考虑到变量的生命周期,在合适的位置声明变量
‘肆’ 用C语言分配开辟内存问题
你的代码不是C的,其实现在语言比较强大,也许在内存回收上做了完善,我不会C++,我知道JAVA语言,他本身在内存回收上面做了优化,就是在堆中申请的内存,操作系统没回收,但JAVA语言最终编译成可运行码的时候,回收了这块内存(JAVA的垃圾回收机制,蛮强的,不过我不太喜欢)。你可以试试用C写,用malloc 来申请,这个应该不会被回收的,你可以试试,当然可能和其它原因有关。
最后如果你想学习内存管理的话,方向是:操作系统理论中的页式内存管理,地址的印射这2部分是理论(比较简单,实际情况比这复杂一点,先看理论比较好)
等真的明白了(应该不难懂),下面就有难度了,选一个比较流行的CPU的地址映射(各种不同的CPU地址映射是不一样的),我看的是intel 80386后出现的保护模式(其实是286后出现的,不过286没什么名气),以及linux中内存管理的源代码(记得结合书看,直接看代码很难懂)。
==========================================
你的问题算是有点难度和深度的。
关于内存开辟问题,在linux中有个很特殊的内存段,它的大小是8K,我们叫他系统堆栈空间,任何一段程序代码在运行时候它都是一个进程,它都会有这么一个8K的系统堆栈空间。局部变量都是放在这样一个8K空间中,包括int a,int a[100], int *a.他们都放在这里。
那么第一个问题就回答了,int a就是放在系统堆栈空间中。当这个进程死亡的时候,会有其它的进程来回收这个空间(它自己会指定的,一般是其父进程),所以你不需要自己手动去释放局部变量占地内存。
至于int * a;然后你new一个空间这个就有点不同了,首先 * a还是个局部变量,他是存在于系统堆栈中。不过它存的比较特殊是一个逻辑地址,不是一个值(其实逻辑地址也就是一个无符号的16位整数而已)。当你new 的时候,会在堆空间中开一个空间,并把这个空间的地址放到刚那个 a中去。很明显新申请的空间不是在系统堆栈空间中,父进程(一般是)是不会回收这个内存的,这就是为什么你要自己 free(a) 这样来释放空间。
我们常说局部变量不要过大,比如int a[10000]这是不允许的,可以看出来只有8K的大小的内存,而且他还不全部都是给局部变量使用,他有相当一部分内存是给进程控制块和中断返回现场用的(读过linux源代码你就清楚了),另外C语言不检查数组边界,如果你int a[4]数组,而不顾一切的向这个数组上放东西,你就有可能很运气的把中断的返回地址给冲掉,聪明的人会放一个新的返回地址进去,而这个地址返回一个恶意的进程。知道会发生什么了,这就是缓冲区溢出攻击。
windows虽然不太一样,但原理差不多。
‘伍’ c语言释放内存的问题
释放空间是指用“动态申请内存函数”申请成功的空间,不是你写的代码占用的空间。你写的代码的可执行文件占用的空间要等程序完全退出后才能自动释放,动态申请的空间在使用完毕后可以用对应的“释放函数”释放,以防止所谓“内存泄漏”——就是把内存空间用完了,程序无法运行下去了。如果只申请不释放,积累多了就会产生内存泄漏问题;在空间申请得较少的情况下也不至于一定产生泄漏,等程序退出时也就自动释放了。但写合格的程序是不能有这种指望的,正确的做法是“申请——成功后使用——使用完后及时释放。
‘陆’ C语言各种数据在内存中的分配方式,分别对程序的运行效率有哪些影响
内存分配?
堆栈的综合效率最高(除寄存器外),一般函数(包括main())的变量都是在堆栈内的。
你可以显示声明register 但是是存在寄存器还是一般的堆栈完全由编译器决定优化,其实你加了也没用。。。。。堆栈是在内存的一块固定大小的区域,比较小,数据量大了会爆栈(综合最高是因为会有部分内容进入稿茄局寄存器,寄存器比内存快)。
全局变量是在全局变量区的,全局变量区是在内存中的固定大小的一块区域。全局变量区也不怎么大,但是比堆栈大多了。。。。
函数代码区。。。是在内存 你无视好了。。。
堆区 是在内存的一块很大很大的区域,一切动态建立的对象(c用alloc家族函数 c++的new)都是在堆区,一般堆区是不会爆的,除非真的很大大大大大。。
效率上讲 寄存器纳运最快,然后就是内存了,磁盘的读写不考虑。
综上,编译器会帮你优化的,你只要关心会不会爆栈,会不会爆全局变量,就行了。。
还有字符串常量区,也是在内存中的,你也无视好了。。。。。
还有静态区也是在内键让存中的,大小是编译器编译时决定的,你也无视好了。。。。
‘柒’ C语言中是如何释放内存单元的;原理又是什么
C管理内存大致可以理解为两种,分配在栈上的,一个是分配在堆上的。
临时变量,动态变量,分配在栈上,运行完,直接弹出栈,就没了。
分配在堆上的内存,释放的时候,基本上可以理解为,指针不指这里了。也就失去了对这块内存的控制。其实所谓的释放。字面意思容易让人理解错。
有些机器有些操作系统,会在释放的时候清空这段内存,但是这种做法效率不高,但是安全,很少有机器这么做,多数都是所谓释放,就是不让你控制这块内存了而已。