bestlong22 发表于 2012-12-12 16:40:46

malloc开辟的内存空间的问题

关于malloc开辟的内存空间:(用xp microsoft visual编译)
      void main()
{
int rela;
char *str1=NULL,*str2=NULL;//指针应该先初始化,再分配内存空间
str1 = (char *)malloc(n*sizeof(char));
str2 = (char *)malloc(sizeof(char));
       printf("Please input string NO.1:");
}
当分配完指针内存地址后,查看指针值:
当n=1时
str2:0x00032998
str1:0x00032950
按照我的理解应该是str2-str1应该就是malloc分配给str1的内存空间
str2-str1=0x48=72;
那么给str1分配的内存空间应该是72个字节的内存
当n=1~12
str2:0x00032998   str2-str1=0x48=72
当n=13~28
str2:0x000329a8   str2-str1=0x58=88
当n=29~44
str2:0x000329b8   str2-str1=0x68=104
当n=45~60
str2:0x000329c8   str2-str1=0x78=120
当n=61~76
str2:0x000329d8   str2-str1=0x88=136
..................
从查看指针内存来看:没分配一个指针的时候,会默认的多分配60个字节内存。
所以说str1 = (char *)malloc(sizeof(char)); 应该与str1 = (char *)malloc(10*sizeof(char)); 一样的才对
请大侠能指教。

bestlong22 发表于 2012-12-12 17:49:05

好像明白了一点
先看一下在《UNIX环境高级编程》中第七章的一段话:

大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。这意味着如果写过一个已分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是因为这种错误不会很快就暴露出来,所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。

以上这段话已经给了我们一些信息了。malloc()申请的空间实际我觉得就是分了两个不同性质的空间。一个就是用来记录管理信息的空间,另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。在C语言中,用结构体来记录同一个对象的不同信息是天经地义的事!下面看看这个结构体的原型:

struct mem_control_block {

   int is_available;   //这是一个标记?

   int size;         //这是实际空间的大小

   };

对于size,这个是实际空间大小。这里其实我有个疑问,is_available是否是一个标记?因为我看了free()的源代码之后对这个变量感觉有点纳闷(源代码在下面分析)。这里还请大家指出!
http://www.amobbs.com/thread-824704-1-1.html
页: [1]
查看完整版本: malloc开辟的内存空间的问题