当前位置:首页 » 编程语言 » c语言怎么无限开内存
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言怎么无限开内存

发布时间: 2022-08-10 02:29:25

A. 用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虽然不太一样,但原理差不多。

B. c语言开辟内存的问题

①C语言编码的时候不会开辟内存,只有在编译之后才会生成可执行程序,在可执行程序里面给出内存的开辟方法。
②真正内存的开辟是在程序运行的时候。程序装载到内存里面,开始运行才会真正开辟内存。
③C语言程序装载到内存中之后,其在内存中的进程空间中有代码区、全局数据区、堆区和栈区。代码区存放代码编译后的执行指令;全局数据区存放全局变量和静态变量;栈区存放函数内部的局部变量和返回地址,这部分内存是在函数调用时才申请的;堆区是自由申请内存的区域。需要使用malloc等自己分配内存,这部分内存需要自己释放。
④向int i;这样的句子,在C语言中,既是声明又是定义,所以这样的语句其实已经分配了内存,而不是等到赋值的时候。
⑤有不懂的可以追问。

C. c语言中,如何申请较大的内存空间

用malloc应该可以的吧

再不行,用静态的,如p[512*1024*1024]
声明成全局的,因为局部变量在栈中,栈没有这么大

D. 用c语言怎样无限开辟内存、或编一个通过无限开辟内存,处理大量数据的程序来让电脑死机。

生成大链表,最好里面用大节点,这样可以加速内存的耗尽,分配时用calloc申请内存,malloc也可以,生成中的节点中多用指针,然后指针不指空值(这样就有可能指到系统区去),这里的用三个do{}while(1)来实现,一个是生成链表,一个是用链表节点值做任意的运算——这两个是同一等级的,还有一个是最外层。这里一定是要用到break的……思路是这样的,你也是这样想的吧,想必我说的就是你想的,只是你在编译是总是不得过,对啊,呵呵,别傻啦,我们能找到的编译器是要做安全性检查的(不光是一些语法的)
除非,你在写之前,自己先写一个编译器来……或者你已经找到了这样的工具

E. c语言 在一个线程上开辟一段内存;

这个不是C语言能做的,因为有“类”。
基本实现思路和@fengfei5551223 类似
提出一些不同的实现细节:
1、申请空间为了做到最大化兼容,使用void指针;size是具体的数值
void * buf=NULL;
void create_memory(){
buf=(void *) malloc(size);//
}

2、你的要求是开辟内存,写内存,读内存,那么应该是操作的同一块内存区域,
因此传参数不能总是调用create_memory方法,否则每次总是新申请内存,
没有达到共用的目的
class A{
char *buf=NULL
public:
//增加一个获取开辟空间地址函数
void *get_buf(){
return buf;

}
};
int main(){
A *a;
pthread_create(&a[0],NULL,a->create_memory,NULL);
if(NULL != a->get_buf()){ // 为了保证开辟成功内存
//将开辟好的空间地址作为参数传递给其它线程使用
pthread_create(&a[1],NULL,a->write_memory,a->get_buf());
pthread_create(&a[2],NULL,a->read_memory,a->get_buf());
}
。。。
}

3、对开辟出的内存区域没有最终销毁这个是很危险的,
当然我不清楚你的需求,但是大多数场景下还有最后一步是做destory;

而且要用到同步互斥变量,所以最后需要报这些变量销毁;

这样使得程序更具有健壮性。

F. c语言里如何开辟一片没有上限的内存来存数据我知道可以用数组,但是数组要设置数组大小,我现在不想设

C语言里貌似没有这种东西……要分配内存就必须指定大小,如果是C++使用STL容器应该可以……

G. C语言中是如何释放内存单元的;原理又是什么

C管理内存大致可以理解为两种,分配在栈上的,一个是分配在堆上的。

临时变量,动态变量,分配在栈上,运行完,直接弹出栈,就没了。
分配在堆上的内存,释放的时候,基本上可以理解为,指针不指这里了。也就失去了对这块内存的控制。其实所谓的释放。字面意思容易让人理解错。
有些机器有些操作系统,会在释放的时候清空这段内存,但是这种做法效率不高,但是安全,很少有机器这么做,多数都是所谓释放,就是不让你控制这块内存了而已。

H. 怎么用C语言写个循环来占满4G内存

#include<stdio.h>
#include<stdlib.h>
# include<string.h>
void main()
{
int *a;
int b=1024*1024*sizeof(int);
int i=0;
while(1) {
a=(int *)malloc(b);
memset(a, i++, sizeof(b)); //评论说扛住了,估计是编译器优化了,只好上大杀器了

}

卡死你。。。

I. C语言中如何动态增加内存空间

有一个malloc函数,专门用来进行动态内存管理的