malloc分配内存时,通常会预分配更大的内存作为内存池,那这部分内存能被使用吗?
读操作
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr = (int*)malloc(0);
if (ptr == NULL) {
printf("分配失败,返回NULL\n");
}
else {
printf("分配成功,地址: %p\n", ptr);
printf("%d\n", *ptr);
free(ptr);
}
return 0;
}
读取分配的空间或者进行解引用,是可以执行的,那如果实际写这块空间呢?
写操作
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr = (int*)malloc(0);
if (ptr == NULL) {
printf("分配失败,返回NULL\n");
}
else {
printf("分配成功,地址: %p\n", ptr);
*ptr = 1;
printf("%d\n", *ptr);
free(ptr);
}
return 0;
}
在实际进行写操作后,会导致崩溃
原因
malloc分配的内存是虚拟内存,在实际写入后触发缺页中断,才会与实际的物理内存联系起来;操作系统检测到对应的物理页未分配或无写权限,则发生段错误。