小诸葛080 发表于 2014-10-7 09:40:47

关于malloc函数动态分配内存的大小

char *p;
p = (char *)malloc(10*sizeof(char));
当输入大于十个字符时后面的仍然可以打出,为什么不会报错?:

仰望天上的光 发表于 2014-10-7 16:36:03

当输入大于9个字符时,后面的字符有时可以打印出,有时不能打印出。就好像,当你自己的钱用完了,从别人口袋里拿钱用的时候,有事可以拿出,有时不能拿出一样。

小诸葛080 发表于 2014-10-7 20:51:57

仰望天上的光 发表于 2014-10-7 16:36
当输入大于9个字符时,后面的字符有时可以打印出,有时不能打印出。就好像,当你自己的钱用完了,从别人口 ...

谢谢啦!

计机羊咩咩 发表于 2014-10-8 00:26:09

事实上超出10之后就是溢出了   但是字符串输出只看截断符如果没有截断符 那么会继续输出   某些方面的溢出编译器是识别不了的只能自己去管理和限制

墨白_找 发表于 2014-10-8 09:55:50

get it ~

网络学习 发表于 2014-10-9 02:18:39

结果到底是怎样的呢

逍遥 发表于 2014-10-10 15:37:52

溢出了!

优雅的独行者 发表于 2014-10-10 19:54:24

malloc分配内存一次是分配4kb大小的内存页,对数组后面的溢出部分你可以写入 但是不能保证本进程或进程不能进行操作了。 当你写入值后你不能安全的使用用 因为这段溢出的内存可以被其他地方占用 当你引用其数值时 可能已经不再是当初你写入的值了。
并不是只要溢出就会出现崩溃之类的 只要你向溢出的位置写入的值对其他地方的使用是合法的就行

小诸葛080 发表于 2014-10-11 08:25:55

优雅的独行者 发表于 2014-10-10 19:54
malloc分配内存一次是分配4kb大小的内存页,对数组后面的溢出部分你可以写入 但是不能保证本进程或进程不能 ...

也就是说溢出的部分如果没有被覆盖还是可以输出的,只不过不安全,有被覆盖掉的风险?

小诸葛080 发表于 2014-10-11 08:27:43

网络学习 发表于 2014-10-9 02:18
结果到底是怎样的呢
比如输入abcdefghijklmn,这些字母全部可以输出,并非只输出分配地址的10个字符

优雅的独行者 发表于 2014-10-11 08:54:52

小诸葛080 发表于 2014-10-11 08:25
也就是说溢出的部分如果没有被覆盖还是可以输出的,只不过不安全,有被覆盖掉的风险?

对的 就是这个意思 只要别的地方不使用溢出部分就可以正确输出 如果别的地方使用了溢出部分 就会输出错误了

牡丹花下死做鬼 发表于 2014-10-11 18:01:45

已经溢出了但是吧 这个要看情况有时候可以有时候不行

G0398 发表于 2014-10-12 19:10:57

malloc分配地址属于官方登记过的    所有的操作受“法律”保护
其它操作是非法的   出现问题后果自负
页: [1]
查看完整版本: 关于malloc函数动态分配内存的大小