用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)); 

}

//img.mukewang.com/szimg/5b4e109a0001b21304520078.jpg

     我明明开辟的是 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));                   

  }  

//img.mukewang.com/szimg/5b4e15c2000185b704070454.jpg

我还试过 给 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部分:

//img.mukewang.com/szimg/5b4e1cd80001ad5807350202.jpg


----------


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的要求极高:)

0
2
liuyubobobo
回复
qq_飞羽醉月_0
对!欢迎来到C的世界:)
2018-07-18
共2条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程