用malloc开辟空间在用malloc_usable_size查看开辟的空间发现数目不符合
来源:4-5 基础堆排序和Heapify
qq_飞羽醉月_0
2018-07-17
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *a = (char malloc(sizeof(char)*10);
printf("%d\n", malloc_usable_size(a) / sizeof(char));
}
我明明开辟的是 10个 char 空间为何显示的是24个char空间
我又做了个小实验
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n = 41;
char *a = (char *)malloc(sizeof(char)*n);
int i;
for(i = 0; i < 24; i++){
a[i] = i;
}
for(i = 0; i < 24; i++){
printf("%d\n", a[i]);
}
printf("array is: %d, a is: %d\n",sizeof(char)*n, malloc_usable_size(a));
}
我还试过 给 a+24 处的地址赋值,但是提示空间不存在。
也试过传sizeof(char) * 24 也就是 24个直接进去,实际开辟的是24个字节的空间。
传 25,开辟的是40个字节。
这个结果表明 我确实传进去的是 sizeof(char)*10 个字节 但是实际开辟了24个字节的空间,
这是为何?
1回答
-
liuyubobobo
2018-07-18
malloc_usable_size 本身不是 C 语言标准的一部分。
malloc_usable_size 本身就是会返回更大的值。具体可以参见malloc_usable_size的文档:http://man7.org/linux/man-pages/man3/malloc_usable_size.3.html
注意Note部分:
----------
C / C++ 本身就是不对空间越界进行检查。所以 C / C++拥有极强的底层访问能力。不要说malloc,连使用new,甚至是使用vector,都可以“合法”地进行数组越界。可以尝试下列代码:
int *a = new int[1]; // a只有一个空间 a[10] = 10; cout << a [10] << endl; int b[1]; // b只有一个空间 b[10] = 10; cout << b[10] << endl; vector<int> v(1, 0); // v只有一个空间 v[10] = 10; cout << v[10] << endl;
在绝大多数情况,上述程序都是可以正常运行的。但是,这是因为C++编译器不进行数组越界检查。这个任务在开发者的头上。a[10]的意思就是在a这个内存向后移动10个sizeof(int)而已,C/C++假设你就是要访问那片内存。在更复杂的程序中,这样的代码可能导致程序崩溃。C/C++不对程序的“安全性”做更多的检查,这是一把双刃剑。正是因为这个原因,C/C++的代码执行效率高,有更强的底层访问能力;同时,也更容易在不自觉的情况下写出错误的代码,由于编译器不提示,在大型项目中对开发者debug的要求极高:)
022018-07-18
相似问题