malloc分配内存的问题,内存是连续的吗?
本文介绍了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屋!
查看全文