关于linux下的malloc函数和windows下的不同

C语言 码拜 10年前 (2015-05-11) 1725次浏览 0个评论
 

今天突然在linux下试了下malloc,以下是我的代码
#include <stdio.h>
#include <stdlib.h>
void main()
{
    int *n;
    n = (int *)malloc(sizeof(int)*10);
    int i = 0;
    for (i = 0;i < 11;i++)
        *(n+i) = i;
    for(i = 0;i < 11;i++)
        printf(“%d “,*(n+i));
    printf(“\n”);
    free(n);
}
    按道理malloc了10个int的空间,但是却写入了11个数(20个也可以),这应该是错误,但是在linux下却可以输出0~10
我把代码换到windows下编译运行却无法运行,这是为什么?
    还有在linux下加上free( )就会输出好多信息,这是为什么?

关于linux下的malloc函数和windows下的不同

10分
linux malloc函数的底层是brk,sbrk系统调用现的, windows是其他的系统调用、
linux下的malloc函数在该进程第一次申请内存的时候实际会像内存请求33页的大小(1页=4096字节), 之后程序中再用到malloc的时候就可以直接在这33页中分配, 而不需要系统调用, 减少内核到用户态的切换, 提高效率。

windos也会有这样的一些底层维护, 只是不开源的话无从细说。

关于分配33页是ubuntu系统下的验证结果。

5分
你malloc分配了多少内存就用多少内存,越界肯定是错误的,至于错误的具体表现就跟C库的实现有关,各个C库会保证正确使用库函数的行为一致,但并不保证错误行为也一致。
那个free的错误是因为你越界多写了一个字节导致内存管理列表乱了造成的。
5分
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
Linux是开源的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于linux下的malloc函数和windows下的不同
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!