‘壹’ c语言编译,如何减少内存
用时再申请内存,用完了就放掉,要考虑到变量的生命周期,在合适的位置声明变量
‘贰’ 用c语言怎样无限开辟内存、或编一个通过无限开辟内存,处理大量数据的程序来让电脑死机。
生成大链表,最好里面用大节点,这样可以加速内存的耗尽,分配时用calloc申请内存,malloc也可以,生成中的节点中多用指针,然后指针不指空值(这样就有可能指到系统区去),这里的用三个do{}while(1)来实现,一个是生成链表,一个是用链表节点值做任意的运算——这两个是同一等级的,还有一个是最外层。这里一定是要用到break的……思路是这样的,你也是这样想的吧,想必我说的就是你想的,只是你在编译是总是不得过,对啊,呵呵,别傻啦,我们能找到的编译器是要做安全性检查的(不光是一些语法的)
除非,你在写之前,自己先写一个编译器来……或者你已经找到了这样的工具
‘叁’ 请问在C语言编程时,怎样才能更加合理的分配和使用内存
那应该是你在堆上分配的空间(就是用new或malloc之类分配的空间)没有收回,而造成内存泄漏了吧!程序运行的时间长了就把内存给泄漏光了。。。(可能性最大)
要不就是栈空间被你用完了?~~~比如在栈上分配了很大的数组之类的,造成栈溢出什么的。(这也有可能)
再或者,你频繁的在堆上分配和释放空间,最终造成内存碎片,而无法分配到你所要求的整块空间了。(这种可能最小。。。特别是现在的操作系统内存管理都很优秀的,除非你是在嵌入式系统中运行的)
‘肆’ 怎样编写C语言代码使运行内存更小
方法多了:
1、尽量少用系统函数;
2、不要多定义变量;
3、使用合适类型的变量;
4、减少代码;
5、使用小模式编译;
等等
‘伍’ 用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语言各种数据在内存中的分配方式,分别对程序的运行效率有哪些影响
内存分配?
堆栈的综合效率最高(除寄存器外),一般函数(包括main())的变量都是在堆栈内的。
你可以显示声明register 但是是存在寄存器还是一般的堆栈完全由编译器决定优化,其实你加了也没用。。。。。堆栈是在内存的一块固定大小的区域,比较小,数据量大了会爆栈(综合最高是因为会有部分内容进入寄存器,寄存器比内存快)。
全局变量是在全局变量区的,全局变量区是在内存中的固定大小的一块区域。全局变量区也不怎么大,但是比堆栈大多了。。。。
函数代码区。。。是在内存 你无视好了。。。
堆区 是在内存的一块很大很大的区域,一切动态建立的对象(c用alloc家族函数 c++的new)都是在堆区,一般堆区是不会爆的,除非真的很大大大大大。。
效率上讲 寄存器最快,然后就是内存了,磁盘的读写不考虑。
综上,编译器会帮你优化的,你只要关心会不会爆栈,会不会爆全局变量,就行了。。
还有字符串常量区,也是在内存中的,你也无视好了。。。。。
还有静态区也是在内存中的,大小是编译器编译时决定的,你也无视好了。。。。
‘柒’ c语言程序运行时 内存问题
以程序的具体执行过程为例来给你讲解,但愿你能理解:
1.程序被打开时,即程序开始运行时,会首先向操作系统请求独占内存空间(一段在程序整个执行过程中都不释放的空间),操作系统会应答请求并分配一段逻辑上连续(其实是将零散的内存空间映射为一段连续的空间)的内存空间给该程序,此时程序得到该段空间的逻辑地址信息,根据地址将程序代码段和数据段装入内存,此时程序载入完成。
2.程序运行中,当某一过程任务需要更大内存空间时,会再次向操作系统发出请求,操作系统会根据请求再次分配内存空间给该程序,当这一过程任务执行完毕后,该内存空间被释放。同时由于操作系统的存储保护,程序在运行过程中只能访问自己所申请的内存空间,不能访问其他程序的内存空间。
3.当程序执行完毕或关闭程序后,该程序所占的所有内存空间都被释放。
当你再次打开程序后,重复上面的过程。
下面对你的问题进行针对性回答:
1.当程序运行时,会调入内存,不同时间运行,程序放在内存的位置也可能不同:每运行一次程序,程序都会重新向操作系统申请内存空间,这时操作系统会分配一段全新的内存空间给程序,故不同时间运行程序,程序在内存中的位置是不同的。
2.使用内存中数据的位置也可能不同:当程序申请内存空间后,操作系统会将所申请的内存空间的地址传给程序,尽管数据的位置不同,但程序知道数据的地址,故程序依然可以根据地址来找到所需要的数据。
‘捌’ c语言怎样优化代码减少占用ram
别用吃内存多的算法就省内存了
能把问题详细说一下么
‘玖’ 关于C语言动态分配内存的问题
要实现动态内存的分配,除了利用含指针成员的结构体之外,还需利用C语言提供的几个标准库函数。(使用时应包含头文件“alloc.h”或“malloc.h”或“stdlib.h”)
1.malloc函数
函数原型为void *malloc(unsigned int size);在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。若size超出可用空间,则返回空指针值NULL。
2.calloc 函数
函数原型为void *calloc(unsigned int num, unsigned int size)
按所给数据个数和每个数据所占字节数开辟存储空间。其中num为数据个数,size为每个数据所占字节数,故开辟的总字节数为 num*size。函数返回该存储区的起始地址。calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。例如: ps=(struct stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。
3. realloc函数:
函数原型为void *realloc(void *ptr, unsigned int size)
重新定义所开辟内存空间的大小。其中ptr所指的内存空间是用前述函数已开辟的,size为新的空间大小,其值可比原来大或小。函数返回新存储区的起始地 址(该地址可能与以前的地址不同)。例如p1=(float *)realloc(p1,16);将原先开辟的8个字节调整为16个字节。
**动态申请的内存空间要进行手动用free()函数释放
例子:
char *p;
p=(char*)malloc(8);//开辟8个字节的存储空间,并把地址赋给指针p,通过指针p对该空间进行存取操作。
*p='L'; //存储字符,所分配空间的第0字节存储L
*(p+1)='o';//分配空间的第一字节存储字符'o'.
*(p+2)='v';
*(p+3)='e';
*(p+4)='\0';
puts(p);//输出字符串
free(p);//释放空间
注意:*(p+n)等价于p[n],(p+n)是地址,而*(p+n)就是取地址(p+n)的内容。
如上面程序中的*(p+1)='A';可写成p[1]='A';
malloc()函数的参数可以是常数、变量或表达式等。除了存放字符串外,malloc()也可取得空间来存储整数等数据。例如存储整数分配空间如下:
int *ptr;
ptr=(int *)malloc(sizeof(int)*4);
malloc()开辟空间存储4个整数数据,由于malloc()总传回第0字节的地址,且返回值必定是char*类型,所以要通过(int *)来强制转换为指向整型后存入指向整型的指针ptr.
当用malloc()函数分配空间时,若计算机无法提供足够的空间分配则会返回NULL指针。所以,若返回的指针为NULL,就表示可分配的剩余空间已不足。
‘拾’ c语言内存问题
答案是C
p1是存储在栈区
p2这个指针是存储在堆区的,因为p2是malloc分配的空间
"123456"是一个常量,所以它是存储在常量区的,并不是存储在栈区
栈区和堆区方向是相反的,一个向下增长,一个向上递减。