- 主题:请教一下malloc和_msize函数
如下一段程序:
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
int main()
{
int *p1;
int *p2;
int i;
p1=(int*)malloc(40);
int b=13;
for(i=0;i<b;i++)
{
p1[i]=i;
printf("%d\n",p1[i]);
}
int a;
a=_msize(p1);
printf("%d\n",a);
}
有两个不懂的地方请教一下:
(1)开辟的是40个字节的空间,为什么程序允许b可以大于20也不报错?
(2)当b<=12时,a是40,当b>=13时,a是72,这是为什么呢?
求指点,谢谢
--
FROM 124.126.201.*
1 这是你逻辑上的错误,c编译器不能保证对所有逻辑错误都报错的,这就是为什么我们需要asan,tsan,msan之类的工具
2 重要的是你要理解这是错误的行为,错成什么样并不重要,也许它就读到了一段垃圾数据,鬼知道垃圾数据是个什么结果
【 在 sqsl 的大作中提到: 】
: 标 题: 请教一下malloc和_msize函数
: 发信站: 水木社区 (Fri Sep 8 23:05:35 2023), 站内
:
: 如下一段程序:
:
:
: #include <stdlib.h>
: #include <stdio.h>
: #include <malloc.h>
:
: int main()
: {
: int *p1;
: int *p2;
: int i;
: p1=(int*)malloc(40);
:
: int b=13;
: for(i=0;i<b;i++)
: {
: p1[i]=i;
: printf("%d\n",p1[i]);
: }
: int a;
: a=_msize(p1);
: printf("%d\n",a);
: }
:
:
: 有两个不懂的地方请教一下:
: (1)开辟的是40个字节的空间,为什么程序允许b可以大于20也不报错?
: (2)当b<=12时,a是40,当b>=13时,a是72,这是为什么呢?
: 求指点,谢谢
:
:
:
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 124.126.201.*]
--
FROM 107.204.171.*
你这走上邪路回不来了
从开始就一直在搞 "他为什么错成这样"
【 在 sqsl 的大作中提到: 】
: 如下一段程序:
:
: #include <stdlib.h>
: ...................
--
FROM 111.33.205.*
第一个问题是不是问错了?分配的40字节,当然允许访问20字节啊。你要问的是不是访问40字节以上?
OS内存的分配和释放实际是按page操作的,程序的CRT函数malloc()所分配的heap block如果处于某个page的中间,或者后面还有一个能读取的page,那么可以读取超过40字节的内容而不崩溃,但已经属于越界了。MSVC调试器里面看一下对应的内存就知道了,debug -> windows -> memory。
如果malloc()所分配的heap block如果正好处于某个page的尾部,并且后面没有任何可以读取的page了,那么你读取超过40个字节就立马会崩掉。这就是检查内存越界的那些工具的原理,在前面/后面设立一个guard page,设置为不允许读写。
_msize()是MSVC特有的,返回值反映的是MSVC的heap的实现,通常不需要关心这个,也不需要调用这个函数。
如果对malloc()的内部实现好奇,可以读它的源代码。MSVC和ntdll的heap实现有多个版本,一般只有写堆溢出利用代码的才关心。
【 在 sqsl 的大作中提到: 】
: 如下一段程序:
:
: #include <stdlib.h>
: ...................
--
FROM 221.218.160.*
申请了40字节的长度,最多可以存20个短整型的数啊
【 在 z16166 的大作中提到: 】
:
: 第一个问题是不是问错了?分配的40字节,当然允许访问20字节啊。你要问的是不是访问40字节以上?
:
: OS内存的分配和释放实际是按page操作的,程序的CRT函数malloc()所分配的heap block如果处于某个page的中间,或者后面还有一个能读取的page,那么可以读取超过40字节的内容而不崩溃,但已经属于越界了。MSVC调试器里面看一下对应的内存就知道了,debug -> windows -> memory。
:
--
FROM 1.202.122.*
没注意看。40字节只能存10个int, int是4字节的话。
【 在 sqsl 的大作中提到: 】
: 申请了40字节的长度,最多可以存20个短整型的数啊
:
--
FROM 221.218.160.*
你在用上古时期的编译器还是在看上古时期的书?
【 在 sqsl 的大作中提到: 】
: 申请了40字节的长度,最多可以存20个短整型的数啊
: 。
--
FROM 107.204.171.*
学习 C 语言要记住一句话:
C 只能保证正确的程序可以得到正确的结果,
而无法保证错误的程序一定会得到错误的结果。
你把这句话读十遍,你所有问题就都迎刃而解了。
如果还有困惑,就再读十遍。
【 在 sqsl 的大作中提到: 】
: 如下一段程序:
: #include <stdlib.h>
: #include <stdio.h>
: ...................
--
FROM 163.125.228.*
数学也是这样:
正确的前提必定得到正确的结果
错误的前提可以得到任何(你想要的)结果
【 在 flw 的大作中提到: 】
: 学习 C 语言要记住一句话:
: C 只能保证正确的程序可以得到正确的结果,
: 而无法保证错误的程序一定会得到错误的结果。
: ...................
--
FROM 223.167.225.*
是我基本知识错了,刚查了一下,int可能占用2个字节(短整)或4个字节(长整),那它什么情况下占2什么时候占4呢?
【 在 flw @ [CProgramming] 的大作中提到: 】
:
: 学习 C 语言要记住一句话:
:
: C 只能保证正确的程序可以得到正确的结果,
: 而无法保证错误的程序一定会得到错误的结果。
--
FROM 219.142.154.*