当前位置:首页 > 开发语言/框架 > C语言

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

优良自学吧提供关于linux下的malloc函数跟windows下的不同,关于linux下的malloc函数和windows下的不同今天突然在linux下试了下malloc,以下是我的代码 #include <stdio.h> #include <stdlib.h> void main()

关于linux下的malloc函数和windows下的不同
今天突然在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下的不同
------解决思路----------------------
linux malloc函数的底层是brk,sbrk系统调用现的, windows是其他的系统调用、
linux下的malloc函数在该进程第一次申请内存的时候实际会像内存请求33页的大小(1页=4096字节), 之后程序中再用到malloc的时候就可以直接在这33页中分配, 而不需要系统调用, 减少内核到用户态的切换, 提高效率。

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

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

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

(本文来自互联网,不代表搜站(http://www.ylzx8.cn/)的观点和立场)
本站所有内容来自互联网,若本站收录的信息无意侵犯了贵司版权,请给我们来信(ylzx8cn@163.com),我们会及时处理和回复,谢谢