关于c语言malloc的用法。。

问题描述

关于c语言malloc的用法。。

c语言的malloc语句中动态获取的最大空间和电脑的什么有关?
c语言的malloc语句中动态获取的最大空间和电脑的什么有关?

解决方案

首先,计算机的物理内存、计算机的寻址能力、计算机的地址空间、malloc申请的值、操作系统进程的地址空间几个概念都是不同的。

计算机的寻址能力是字长决定的,一台32位的电脑,寻址能力是4GB,注意,这些地址中还有dma bios io等等的保留地址,它留给内存的地址空间大约是3.5GB左右(具体计算机不同)
计算机的寻址能力决定了计算机物理上能访问的最大内存空间。但是物理内存可能比它大,也可能比它小。你买计算机,会知道内存的大小,2GB 4GB 8GB等等。
计算机为每个进程划分了独立的虚拟地址空间。对于windows(32bit)来说,2GB以下是用户空间,2GB以上是系统空间。这就决定了一个32bit的进程,只能访问2GB的内存,是不是正好2GB呢?不是,因为堆栈、静态区等等也占用了一些地址,而且堆上的地址也不是连续的,如果碎片很多,会出现有空间没法分配的情况。
如果你的计算机只安装了1GB的内存,是不是只能访问1GB(或者更少)呢?也不是,因为操作系统会使用页面文件(俗称虚拟内存,此虚拟内存不是虚拟地址空间,而是指拿磁盘作为页面交换空间模拟出来的内存)。
那么malloc分配了一个很大的空间,是不是一定就报内存溢出/内存不足的错误呢?也不是,因为操作系统分配内存是按照懒惰分配的原则。也就是如果你没有实际访问这些内存,那么光分配,这些虚拟内存地址被分配出去了,但是并没有使用实际的内存,也就是没有分配页。所以malloc能分配的内存比实际上没有使用的物理内存还要大。

解决方案二:

现代操作系统,用户可用内存都是虚拟内存,和物理内存实际大小关系不大了
但是内存多少,和电脑可以开多少进程,和大数据量程序的效率,关系依然不小
物理内存小了,页面就要频繁交换,对大数据量的程序(并且如果有很多进程再跑)来说,容易产生内存抖动。
虚拟内存,主要问题是CPU和操作系统,
给你提供多大的地址空间可用,其中某些空间。也不是应用程序可以使用的
操作系统,硬件要占用一部分内存空间。其余的才是可用内存空间。
可用内存空间,刨去应用程序的静态空间,代码空间,堆栈空间
以及其他必须占用的内存空间。才是可以动态分配的堆空间。
32Bits Windows 很难用到2G以上的内存,
采用某些手段最高可用3G内存,但是未必一定是实际物理内存。
当然,如果物理内存有4G的话
程序运行在物理内存中的概率还是蛮大的
64Bits应该就没4G内存的限制了

解决方案三:

.版本 2

.子程序 CALL_拾取
.参数 对象地址, 整数型
.参数 物品地址, 整数型, , 地址段
.局部变量 物品EBP, 整数型
.局部变量 拾取EBP, 整数型

物品EBP = 十六到十3 (#物品栏)
拾取EBP = 十六到十3 (#拾取CALL)
置入代码 ({ 96, 139, 181, 8, 0, 0, 0, 139, 54, 139, 141, 252, 255, 255, 255, 139, 12, 49, 255, 181, 12, 0, 0, 0, 139, 133, 248, 255, 255, 255, 255, 208, 97 })

解决方案四:

c语言的malloc语句中动态获取的最大空间和电脑的什么有关?

肯定和电脑的内存和cpu有关了。

内存限制着理论上的存储空间界限
cpu的可以处理的字长也是,处理的字长越大,指令本身的体积越大,占用内存也大

另外就是你的c程序在跑的时候,其实是分配给你一个进程空间的。
这个进程空间内资源限定好了。
你使用malloc分配的内存空间应该不能逃脱这个进程的内存空间的。

如果你分配越多,那么应该是进程的资源占用较多。

所以这个和操作系统的类型还有关系,到底可以给进程多大的空间。

解决方案五:

malloc的最大申请空间和操作系统对进程设置的堆空间大小有关,和物理内存没有关系。

解决方案六:

当然有关系,至少电脑提供的可用内存要大于 malloc 申请的内存大小。

时间: 2024-09-09 22:35:09

关于c语言malloc的用法。。的相关文章

c语言-C语言malloc后使用sizeof的问题

问题描述 C语言malloc后使用sizeof的问题 编译器visual studio 如下代码: int **ip; ip = (int **)malloc( sizeof(int*) *2); for(int i = 0;i < 2 ; ++i) { ip[i] = (int *)malloc(sizeof(int) * 3); } //测试sizeof(ip)/sizeof( int *)值为1, //sizeof(p)值为4, //测试sizeof(ip[0])/sizeof( int)

go语言变量定义用法实例_Golang

本文实例讲述了go语言变量定义用法.分享给大家供大家参考.具体如下: var语句定义了一个变量的列表:跟函数的参数列表一样,类型在后面. 复制代码 代码如下: package main import "fmt" var x, y, z int var c, python, java bool func main() {     fmt.Println(x, y, z, c, python, java) } 变量定义可以包含初始值,每个变量对应一个. 如果初始化是使用表达式,则可以省略类

linux c语言 select函数用法

linux c语言 select函数用法 表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<unistd.h> 定义函数 int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout); 函数说明 select()用来等待文件描述词状态的改变.参数n代表最大的文件描述词加1

C语言递归操作用法总结_C 语言

本文实例总结了C语言递归操作用法.分享给大家供大家参考,具体如下: 用归纳法来理解递归 步进表达式:问题蜕变成子问题的表达式结束条件:什么时候可以不再是用步进表达式直接求解表达式:在结束条件下能够直接计算返回值的表达式逻辑归纳项:适用于一切非适用于结束条件的子问题的处理,当然上面的步进表达式其实就是包含在这里面了. 递归算法的一般形式: void func( mode) { if(endCondition) { constExpression //基本项 } else { accumrateEx

Go语言map字典用法实例分析_Golang

本文实例讲述了Go语言map字典用法.分享给大家供大家参考.具体分析如下: 这段代码生成了青岛.济南.烟台三个城市拼音和汉字的对照字典,根据拼音可以输出汉字 复制代码 代码如下: package main import "fmt" func main(){  var pc map[string] string  pc = make(map[string] string)  pc["qingdao"] = "青岛"  pc["jinan&

GO语言make()分配用法实例_Golang

本文实例讲述了GO语言make()分配用法.分享给大家供大家参考.具体分析如下: make()分配:内部函数 make(T, args) 的服务目的和 new(T) 不同. 它只生成切片,映射和程道,并返回一个初始化的(不是零)的,type T的,不是 *T 的值. 这种区分的原因是,这三种类型的数据结构必须在使用前初始化. 比如切片是一个三项的描述符,包含数据指针(数组内),长度,和容量:在这些项初始化前,切片为 nil . 对于切片.映射和程道,make初始化内部数据结构,并准备要用的值.

Go语言操作redis用法实例_Golang

本文实例讲述了Go语言操作redis用法.分享给大家供大家参考.具体如下: 复制代码 代码如下: package main import (  "fmt"  "log"  "redis" ) func main() {  //DefaultSpec()创建一个连接规格  spec := redis.DefaultSpec().Db(0).Password("");  //创建一个新的syncClient,并连接到Redis的服

Java语言class类用法及泛化(详解)_java

这篇文章主要介绍了Java语言class类用法及泛化(详解),大家都知道Java程序在运行过程中,对所有的对象进行类型标识,也就是RTTI.这项信息记录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类.Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建,具体内容介绍如下: 说白了就是: Class类也是类的一种,只是名字和class关键字高度相似.Java是大小写敏感的语言. Class类的对象内容是你创

Go语言MD5加密用法实例_Golang

本文实例讲述了Go语言MD5加密用法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: import (     "crypto/md5"     "encoding/hex" ) func main() {     h := md5.New()     h.Write([]byte("sharejs.com")) // 需要加密的字符串为 sharejs.com     fmt.Printf("%s\n", h