读书人

几个小问题来自《c和指针》基础好的

发布时间: 2012-03-01 10:25:47 作者: rapoo

几个问题来自《c和指针》,基础好的进...
这几个问题来自《c和指针》,请大家帮解释一下,谢谢大家了:

1. c能够声明的数组最大长度为多少?依据什么而定?

2. 动态分配内存,最大能够获得的内存块有多大?

3,当一次请求500个字节的内存时,实际获得的动态分配的内存数量总共有多大?5000字节呢?他们的区别是什么?

[解决办法]
学习一下,我认为
1.依栈空间大小而定
2.从malloc的参数来看,最大4GB,不超过堆的大小
3.500+,有一些空间用来保存该块内存的信息
[解决办法]
1. c能够声明的数组最大长度为多少?依据什么而定?
-----------
语法里好像没限定,如果是在栈上申请的数组,不能超过栈的大小(VC默认1M-2M),否则会栈溢出。
如果是堆上的,一般没什么问题。

2. 动态分配内存,一次 最大能够获得的内存块有多大?
----------
系统分配给进程的堆空间有4GB的大小,

3,当一次请求500个字节的内存时,实际获得的动态分配的内存数量总共有多大?5000字节呢?他们的区别是什么?
----------
不管是500还是5000,实际上使用的空间会多比你申请的字节数多,用于存放相关信息,

[解决办法]
1. c能够声明的数组最大长度为多少?依据什么而定?
编译器下静态的也就是栈上的内存限制
2. 动态分配内存,最大能够获得的内存块有多大?
<虚拟内存大小&&<4G
3,当一次请求500个字节的内存时,实际获得的动态分配的内存数量总共有多大?5000字节呢?他们的区别是什么?

struct bucket_desc { /* 16 bytes */
00053 void *page;
00054 struct bucket_desc *next;
00055 void *freeptr;
00056 unsigned short refcnt;
00057 unsigned short bucket_size;
00058 };
00059
00060 struct _bucket_dir { /* 8 bytes */
00061 int size;
00062 struct bucket_desc *chain;
00063 };

*The general game plan is that each page (called a bucket) will only hold
00013 * objects of a given size. When all of the object on a page are released,
00014 * the page can be returned to the general free pool. When malloc() is
00015 * called, it looks for the smallest bucket size which will fulfill its
00016 * request, and allocate a piece of memory from that bucket pool.
00017 *
00018 * Each bucket has as its control block a bucket descriptor which keeps
00019 * track of how many objects are in use on that page, and the free list
00020 * for that page. Like the buckets themselves, bucket descriptors are
00021 * stored on pages requested from get_free_page(). However, unlike buckets,
00022 * pages devoted to bucket descriptor pages are never released back to the
00023 * system. Fortunately, a system should probably only need 1 or 2 bucket
00024 * descriptor pages, since a page can hold 256 bucket descriptors (which
00025 * corresponds to 1 megabyte worth of bucket pages.) If the kernel is using
00026 * that much allocated memory, it's probably doing something wrong.

[解决办法]
首先得说我们编程中应该尽量少用资源,追求“极大”值,永远是一种错误。

1. c能够声明的数组最大长度为多少?依据什么而定?
答案:这只和进程最大可给你用的内存有关,一般几百M。因为地址空间内连续的内存不会很多。这个不会有标准答案,因为每个进程的内存布局都不一样,导致连续内存空间不多。我看到的比较强劲的服务器系统中比较大的连续内存大概是100MB左右。64位系统在此会提高很多。

2. 动态分配内存,最大能够获得的内存块有多大?
同上

3,当一次请求500个字节的内存时,实际获得的动态分配的内存数量总共有多大?5000字节呢?他们的区别是什么?
依据实现,因为操作系统需要在内存开头加一些信息块,不同操作系统不一样。两者没有区别
[解决办法]
我只对第2个问题发表看法:

一次最大能申请的动态内存数由函数malloc()中的bucket_dir[]数组设定,
一共最大能申请的动态内存数:4G-code_size(代码) - data_size(仅指全局和静态数据) - stack_size(栈) - arg_size(参数)
[解决办法]
1. c能够声明的数组最大长度为多少?依据什么而定?
locol-由栈大小决定,否则会溢出
global-由你的系统中内存总共的大小决定

2. 动态分配内存,最大能够获得的内存块有多大?
一般在32位系统中不超过4GB,因为CPU最大寻址能力所致,当然也不可能超过你的系统的最大ram,另外当前能获得的最大内存要看最体情况的。

3,当一次请求500个字节的内存时,实际获得的动态分配的内存数量总共有多大?5000字节呢?他们的区别是什么?
肯定超过500或5000,区别要看你的系统而定,例如4楼所述。

读书人网 >C语言

热点推荐