malloc分配内存的问题,内存是连续的吗?

查看:1098
本文介绍了malloc分配内存的问题,内存是连续的吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

下面这个例子,用malloc分配内存,发现不管分配多大,结果好像都是对的?导致这个情况的原因是因为malloc分配的内存是连续的么?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char *s = "Hello,";
    char *t = "World!\n";
    char *r;
    //r = malloc(strlen(s) + strlen(t) + 1);
    printf("The strlen of s is %d\n, and the strlen of t is %d\n", strlen(s), strlen(t));
    //r = malloc(strlen(s) + /*strlen(t)*/ - 1);
    
    r = malloc(1);

    /*
    if(!r)
    {
        perror("malloc");
        exit(EXIT_FAILURE);
    }
    */
    strcpy(r, s);
    strcat(r, t);

    printf("The strlen of r is %d\n", strlen(r));

    printf(r);

    free(r);
}

编译器是gcc 4.8.5

解决方案

不是malloc()的内存是连续的,如果是连续的话,起码也要再用malloc()申请一段内存然后比较两次申请的内存位置才能判定。这是由于malloc()的实现实际上一般是利用mmap()从操作系统申请内存页,这也就意味着内存总是按页分配给进程的。一个内存页的典型大小有 4K 到 4M 不等,第一次malloc()调用通常返回的是第一张申请的内存页的开头部分,所以你稍微越界一点使用也暂时不会有什么问题(但还是不推荐)。不过部分malloc()的实现会在分配出的内存后面留下一些校验值,这样如果发生越界写,通常就可以在free()的时候检查到,这也是早期 DOS 编程会出现屯屯屯的原因。

这篇关于malloc分配内存的问题,内存是连续的吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆