int *p = (int*)malloc(1);到底分配了多大内存

bx_wang 2011-07-04 04:57:57
如题
...全文
624 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
神之言 2011-07-05
  • 打赏
  • 举报
回复
飘过!
majia2011 2011-07-05
  • 打赏
  • 举报
回复
呵呵呵,8byte,写写没什么
OLDMAN_Tbag 2011-07-05
  • 打赏
  • 举报
回复
例如:
pc=(char *)malloc(100);
表示分配 100 个字节的内存空间,
hu7324829 2011-07-05
  • 打赏
  • 举报
回复
学习了
gz_qmc 2011-07-05
  • 打赏
  • 举报
回复
如果我是编译器,你说啥都是错的,我说了算
喜欢我就替你纠正一下,不喜欢老子就报错,你能咋的
AnYidan 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 q191201771 的回复:]

1字节
返回void*强转为int*
int*型变量p接收后
*p按4字节处理
读和写都越界了
[/Quote]

++

你申请了一个字节,然后非说自己有4个字节,compiler 能怎样,罚你钱?
haoruixiang 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 luciferisnotsatan 的回复:]

引用 17 楼 ljljlj 的回复:

引用 9 楼 luciferisnotsatan 的回复:
系统分给程序的内存是按页面来算的,至少4KB。你这虽然只malloc了1字节,但分配了一块内存。你有对那一整块内存的读写权限。

不完全同意你的观点。如果再调用一次malloc(1)那么系统会在什么地方分配空间?在windows xp下是这样的,malloc函数最小的分配空间是4字节。……
[/Quote]
解释深刻 顶
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 ljljlj 的回复:]
引用 9 楼 luciferisnotsatan 的回复:
系统分给程序的内存是按页面来算的,至少4KB。你这虽然只malloc了1字节,但分配了一块内存。你有对那一整块内存的读写权限。

不完全同意你的观点。如果再调用一次malloc(1)那么系统会在什么地方分配空间?在windows xp下是这样的,malloc函数最小的分配空间是4字节。照你那样我写了8KB字节的内容也没有问题。
至……
[/Quote]
不知道你是什么编译器,我vs2005运行你这段代码i==952的时候崩溃,我把2048改成800,发现*q==16,改成400和100,*q==12,改成10,*q==0
9楼的观点似乎更站的住脚一些。
haoruixiang 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 q191201771 的回复:]

1字节
返回void*强转为int*
int*型变量p接收后
*p按4字节处理
读和写都越界了
[/Quote]

正确解释
luciferisnotsatan 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 ljljlj 的回复:]

引用 9 楼 luciferisnotsatan 的回复:
系统分给程序的内存是按页面来算的,至少4KB。你这虽然只malloc了1字节,但分配了一块内存。你有对那一整块内存的读写权限。

不完全同意你的观点。如果再调用一次malloc(1)那么系统会在什么地方分配空间?在windows xp下是这样的,malloc函数最小的分配空间是4字节。照你那样我写了8KB字节的内容也没有问题。
……
[/Quote]
我说的是系统调拨给进程内存,按一个个页来调拨的。调拨后,进程也就有对那块内存的没有字节有相同的访问权限了。至于malloc 1字节的空间,那是在内存页面上再去分配空间。
lz问题是只malloc了1字节,为什么还能转成int,不出问题。原因就是,虽然值malloc了1字节,但之后的3字节,也有访问权限。
  • 打赏
  • 举报
回复
4字节是地址,分配了一字节。。
ljhhh0123 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luciferisnotsatan 的回复:]
系统分给程序的内存是按页面来算的,至少4KB。你这虽然只malloc了1字节,但分配了一块内存。你有对那一整块内存的读写权限。
[/Quote]
不完全同意你的观点。如果再调用一次malloc(1)那么系统会在什么地方分配空间?在windows xp下是这样的,malloc函数最小的分配空间是4字节。照你那样我写了8KB字节的内容也没有问题。
至少这完全取决于malloc的实现。如下代码,*q的结果是4,也就是在p后的第4字节继续下一个分配。
#include<stdio.h>
#include<stdlib.h>
main(){
int *p,*q;
int i;
p=(int *)malloc(1);
q=(int *)malloc(1);
*q=0;
for(i=0; i<2048;i++){
*p=i;
printf("%d ", *p++);}
printf("\n*q=%d", *q);
printf("\n done!");
}
proghua 2011-07-04
  • 打赏
  • 举报
回复
从应用程序的角度是1个字节
在内核操作内存的最小单位是页,32位系统的一页是4k
swordsman 2011-07-04
  • 打赏
  • 举报
回复
我认为LZ的精神可嘉,至少值得我学习。
5t4rk 2011-07-04
  • 打赏
  • 举报
回复
可以认为这是个指针的扩展
本应该是个字符指针
但是进行了强制转化所以就会
出现内存扩张。读写是可以的
但是这样的代码是很危险地
所以特别要注意的
楼主。。。。。禁忌
gz_qmc 2011-07-04
  • 打赏
  • 举报
回复
1字节如何,四字节又如何,蛋疼,小聪明,牛角尖,会害死你的
赵4老师 2011-07-04
  • 打赏
  • 举报
回复
谁也无法完全禁止你读写不该读写的内存单元。
比如可以用ReadProcessMemory、WriteProcessMemory读写别的进程的内存。
luciferisnotsatan 2011-07-04
  • 打赏
  • 举报
回复
越界不一定会出错。
nightkids_008 2011-07-04
  • 打赏
  • 举报
回复
一个内存页。。。
luciferisnotsatan 2011-07-04
  • 打赏
  • 举报
回复
系统分给程序的内存是按页面来算的,至少4KB。你这虽然只malloc了1字节,但分配了一块内存。你有对那一整块内存的读写权限。

int *p;
p = (int*)malloc(1);
*(p+2) = 10000;
printf("%d",*(p+2));

这代码通常也是能输出的。
加载更多回复(8)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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