c语言 malloc疑问

混少年 2014-01-22 09:41:47
比如下面一段代码:
char *name=(char *)malloc(2*sizeof(char));
strcpy(name,"binjing");
printf("name=%s",name);
输出:name=binjing

有一点疑问
char *name=(char *)malloc(2*sizeof(char));
这段执行的时候,分配了两个字节的内存空间,此时name为这段内存空间的首地址
strcpy(name,"binjing");
这段执行的时候,把"binjing"复制给了这段内存空间,但是内存空间一开始只分配了2个字节,这样为什么不会导致”溢出“?

...全文
288 点赞 收藏 26
写回复
26 条回复
cquptzzq 2014年01月25日
我考研的考试题就有一个这样的,明显有溢出,但是可以输出的
回复 点赞
max_min_ 2014年01月25日
溢出了!不安全的,下次当你程序使用内存较多的时候就容易出问题了!
回复 点赞
lin5161678 2014年01月25日
引用 24 楼 lyramilk 的回复:
malloc是每次分配的内存是一个小块,并不是真给的参数,而是更大一些的整块。你malloc(1)还是malloc(4)都是一样的。我没记错的话这个粒度好像是32个字节,你malloc32个字节以内都是一样的。你的分配没有任何问题。 在application verifier中配置好内存检查之后,系统会在malloc分配之后的精确位置上映射一页不可写的内存强制安置一个边界帮助你检查泄露。
误导别人了 malloc 分配的内存块 只有参数指定的那么大一块可以保证安全的使用 malloc 分配比参数多的部分 你怎么知道能用 实现可能是实现 用来存储调试信息 内存保护之类的 别胡乱去改
回复 点赞
lyramilk 2014年01月25日
引用 24 楼 lyramilk 的回复:
malloc是每次分配的内存是一个小块,并不是真给的参数,而是更大一些的整块。你malloc(1)还是malloc(4)都是一样的。我没记错的话这个粒度好像是32个字节,你malloc32个字节以内都是一样的。你的分配没有任何问题。 在application verifier中配置好内存检查之后,系统会在malloc分配之后的精确位置上映射一页不可写的内存强制安置一个边界帮助你检查泄露。
刚才试了一下,貌似应该是8个字节。 malloc(1) === malloc(8)
回复 点赞
lyramilk 2014年01月25日
malloc是每次分配的内存是一个小块,并不是真给的参数,而是更大一些的整块。你malloc(1)还是malloc(4)都是一样的。我没记错的话这个粒度好像是32个字节,你malloc32个字节以内都是一样的。你的分配没有任何问题。 在application verifier中配置好内存检查之后,系统会在malloc分配之后的精确位置上映射一页不可写的内存强制安置一个边界帮助你检查泄露。
回复 点赞
千树之影 2014年01月25日
http://bbs.csdn.net/topics/390699362?page=1#post-396668053
回复 点赞
寒沙胜雪 2014年01月25日
有溢出,推荐用strncpy,就像少用strcat,多用strncat,少用gets,多用fgets一样。
回复 点赞
allenltiverson 2014年01月25日
举个例子,两个人坐一张桌子,因为某种原因对方小妹妹给你分了三八线,严正声明:超过三八线的是小狗! 可是你趁他不注意的时候超过线了。。。她不知道吧。但是万一你动作过大或者某种未知原因,不幸被她发现了,那就。。。越界了必然造成溢出,只不过你的溢出是造成简单的数据覆盖,还是直接适用了未分配的内存。不崩不代表就没溢出。 再举个例子: struct Test { char szData[4]; char cType; } Test t; t.szData[4] = 'e';//单看这个数组的定义和适用你能说没溢出吗?确实越界溢出了 但是,这里结构体两个成员后面还有一个,由于结构体内存连续,t.szData[4]实际上已经是cType这个变量了
回复 点赞
ForestDB 2014年01月24日
已经溢出了 内存是“平坦”的,连续的,给了你两个字节的空间,但是这两个字节是和别的空间连在一起的。 请注意:strcpy是不会帮你做越界检查的,整个C都不会,那是你自己的责任。
回复 点赞
赵4老师 2014年01月24日
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
回复 点赞
木犀花香 2014年01月24日
溢出了,只是没有崩溃而已,楼上说得对!
回复 点赞
MARIOV 2014年01月24日
已经溢出 运气好而已
回复 点赞
初見的畫面 2014年01月24日
肯定内存溢出了,这又是个蛋疼的问题,输出是有可能可以输出。如果name分配的内存(2个字节)后面刚好是编译器不允许你操作的内存,就会报段错误,如果允许你操作,你的操作就会覆盖你没有操作权限的内存,影响其它程序段的运行。
回复 点赞
GavinFj 2014年01月24日
运气好没挂掉,正好申请的2个字节内存后面没有被其它程序占用。
回复 点赞
Mr. Code 2014年01月24日
能打印不等于没溢出,不能用偶然的正确去推导出必然的正确。
引用 楼主 biangren 的回复:
比如下面一段代码: char *name=(char *)malloc(2*sizeof(char)); strcpy(name,"binjing"); printf("name=%s",name); 输出:name=binjing 有一点疑问 char *name=(char *)malloc(2*sizeof(char)); 这段执行的时候,分配了两个字节的内存空间,此时name为这段内存空间的首地址 strcpy(name,"binjing"); 这段执行的时候,把"binjing"复制给了这段内存空间,但是内存空间一开始只分配了2个字节,这样为什么不会导致”溢出“?
回复 点赞
jiandingzhe 2014年01月24日
谁说不安全的操作就一定会马上死的?
回复 点赞
mujiok2003 2014年01月23日
未定义行为.
回复 点赞
iaccepted 2014年01月23日
同意楼上说的,其实这个程序已经溢出了
回复 点赞
Bird_1989 2014年01月22日
运行的结果正确不能代表程序没有问题,这句话应该知道吧,你自己都知道内存溢出了,问题都知道了,解决它
回复 点赞
赵4老师 2014年01月22日
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告