请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

用malloc开辟空间在用malloc_usable_size查看开辟的空间发现数目不符合

#include<stdio.h> 

#include<stdlib.h> 

 int main() 

{       

    char *a = (char malloc(sizeof(char)*10); 

    printf("%d\n", malloc_usable_size(a) / sizeof(char)); 

}

//img1.sycdn.imooc.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));                   

  }  

//img1.sycdn.imooc.com//szimg/5b4e15c2000185b704070454.jpg

我还试过 给 a+24 处的地址赋值,但是提示空间不存在。

也试过传sizeof(char) * 24 也就是 24个直接进去,实际开辟的是24个字节的空间。

传 25,开辟的是40个字节。

这个结果表明 我确实传进去的是 sizeof(char)*10 个字节 但是实际开辟了24个字节的空间,

这是为何?

正在回答 回答被采纳积分+3

1回答

liuyubobobo 2018-07-18 00:58:25

malloc_usable_size 本身不是 C 语言标准的一部分。


malloc_usable_size 本身就是会返回更大的值。具体可以参见malloc_usable_size的文档:http://man7.org/linux/man-pages/man3/malloc_usable_size.3.html


注意Note部分:

https://img1.sycdn.imooc.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 回复 有任何疑惑可以回复我~
  • 提问者 qq_飞羽醉月_0 #1
    那岂不是 用malloc开辟空间 还需要自己维护一个变量记录开辟的空间大小
    回复 有任何疑惑可以回复我~ 2018-07-18 11:23:27
  • liuyubobobo 回复 提问者 qq_飞羽醉月_0 #2
    对!欢迎来到C的世界:)
    回复 有任何疑惑可以回复我~ 2018-07-18 13:06:55
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信