malloc到底分配了多少内存?

Microsues 2011-07-23 12:54:59
#include<iostream>
using namespace std;

int main()
{
int* pt = (int*)malloc(1);
for(int i=0;i<5;++i){
*(pt+i) = i;
cout<<*(pt+i)<<endl;
}
return 0;
}

在代码中,用malloc分配了1byte的空间,为什么可以给pt指向的内存赋5个int呢?
什么情况下会出错呢?
...全文
207 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
TitanQuest 2011-07-23
  • 打赏
  • 举报
回复
这种行为要坚决杜绝
RLib 2011-07-23
  • 打赏
  • 举报
回复
按楼主的情况来分析,malloc分配的内存绝对不只是1byte,其中包括分块信息和内存对齐等。如果malloc返回的指针刚好到了页尾,而下一页不可写,那会异常。
seKnight121 2011-07-23
  • 打赏
  • 举报
回复
首先对malloc(size_t)进行分析,其作用为分配size_t大小的空间,然后将其首地址以void*类型传递出去,此处经过显示类型转换传递给int类型的指针pt,然后lz利用地址递增的方式对对应地址内的数据进行解析。
楼主在此处应该将其理解为类似于数组的形式,Pt只是指向了新开辟的空间的首地址,就像将数组的首地址赋值为pt一样,依次向后读取,很容易越界。道理同数组一样!
ccnunlp 2011-07-23
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;

int main()
{
int* pt = (int*)malloc(5 * sizeof(int));
for(int i=0;i<5;++i){
*(pt+i) = i;
cout<<*(pt+i)<<endl;
}
return 0;
}
hui12345685 2011-07-23
  • 打赏
  • 举报
回复
内存越界!
kotrue 2011-07-23
  • 打赏
  • 举报
回复
1.假如你分配了一个int类型的空间,然后你向这个空间赋值,这些数字会存放在pt之后的一段内存。这段内存不属于你,它们可能覆盖了其它的变量。这样是不安全的。 再者,就算你现在这个5个值存进去了。过一段时间,别的变量有可能把你给覆盖掉。 所以不安全。。。。。。 要用多少就得分配多少。
2.你分配了一个字节 却装了5个int型,太.......


一句话:关于内存:你要用多少,就得分配多少,不是你的就不要碰!!
呔妖怪来嘛 2011-07-23
  • 打赏
  • 举报
回复
越界了吧
pamtry 2011-07-23
  • 打赏
  • 举报
回复
这种情况下已经出错了

首先,“可以”不代表“正确”,就像你也可以声明char array[1];但是依旧可以调用array[10] = 'a';一样
编译器只是根据指针类型进行地址计算,并不会代替程序员做有效性的把关。所有这类操作都可以视为指针越界,即修改了未知的内存位置,存在隐性的风险
所以,这既是C/C++在内存方面给予程序员极大的便利,也算是很多人对C/C++指针诟病的一个缘故

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧