+ -
当前位置:首页 → 问答吧 → 关于malloc

关于malloc

时间:2011-11-29

来源:互联网

《C程序设计语言》(中文版) p230页里面对malloc有简单的介绍:
“ void *malloc(size_t size)
  malloc函数为长度为size的对象分配内存,并返回指向分配区域的指针;若无法满足
  要求,则返回NULL。该函数不对分配的内存区域进行初始化。”

我的疑问是,为什么在main()函数里

C/C++ code

int main()
{
    int* p = (int*)malloc(4);
    std::cout<<*p<<std::endl;//结果输出的是0
}



为什么结果是0?不是指明malloc不对分配的内存区域不予初始化吗?

作者: gyongheng   发布时间: 2011-11-29

你用Release版本看看结果是多少

再者,是0不代表就一定初始化了。

作者: mougaidong   发布时间: 2011-11-29

没有试过,不过针对楼主的问题。
可以回答一下,如果你做的都没有问题的话。
那就是IDE帮你做的事情,别以任何书籍为标准。
要以你使用的IDE为标准,毕竟开发IDE的这些厂商决定着编译的实现代码
而不是那些书,又或者那些C++国际标准。

作者: mymixing   发布时间: 2011-11-29

同楼上所述,该分配区域未初始化,只是其值恰巧为0而已。

作者: nibiewuxuanze   发布时间: 2011-11-29

引用 3 楼 nibiewuxuanze 的回复:
同楼上所述,该分配区域未初始化,只是其值恰巧为0而已。

不可能恰巧为0。

作者: mymixing   发布时间: 2011-11-29

我没有用IDE。
我用的是vim编辑器和gcc(g++)
引用 2 楼 mymixing 的回复:

没有试过,不过针对楼主的问题。
可以回答一下,如果你做的都没有问题的话。
那就是IDE帮你做的事情,别以任何书籍为标准。
要以你使用的IDE为标准,毕竟开发IDE的这些厂商决定着编译的实现代码
而不是那些书,又或者那些C++国际标准。

作者: gyongheng   发布时间: 2011-11-29

我就是纠结在“初始化”这三个字的具体含义上。
烦请你指明你所指的“初始化”
引用 1 楼 mougaidong 的回复:

你用Release版本看看结果是多少

再者,是0不代表就一定初始化了。

作者: gyongheng   发布时间: 2011-11-29

跟编译器没关系,只是恰好为0

作者: namelij   发布时间: 2011-11-29

别恰好是0哦,
我多
> ./a.out
几次之后你保证不是0?
引用 7 楼 namelij 的回复:

跟编译器没关系,只是恰好为0

作者: gyongheng   发布时间: 2011-11-29

引用 5 楼 gyongheng 的回复:
我没有用IDE。
我用的是vim编辑器和gcc(g++)


好吧,那楼主知道IDE和编译器的区别吗?
你没有用IDE,至少得用编译器吧?
IDE难道是凭空编译的?
把你引用我的话中的IDE改成编译器 就OK了。

作者: mymixing   发布时间: 2011-11-29

真快啊,午休时间又过了,闪咯闪咯。。

作者: mymixing   发布时间: 2011-11-29

我都说gcc了.

引用 9 楼 mymixing 的回复:

引用 5 楼 gyongheng 的回复:
我没有用IDE。
我用的是vim编辑器和gcc(g++)


好吧,那楼主知道IDE和编译器的区别吗?
你没有用IDE,至少得用编译器吧?
IDE难道是凭空编译的?
把你引用我的话中的IDE改成编译器 就OK了。

作者: gyongheng   发布时间: 2011-11-29

引用 11 楼 gyongheng 的回复:
我都说gcc了.

行,你神了,你这意思GCC不用编译器就可以把C++代码转成机器码呗。
闪咯,你牛。

作者: mymixing   发布时间: 2011-11-29

烦请你去维基百科查查gcc和g++是什么吧。
引用 12 楼 mymixing 的回复:

引用 11 楼 gyongheng 的回复:
我都说gcc了.

行,你神了,你这意思GCC不用编译器就可以把C++代码转成机器码呗。
闪咯,你牛。

作者: gyongheng   发布时间: 2011-11-29

引用 6 楼 gyongheng 的回复:

我就是纠结在“初始化”这三个字的具体含义上。
烦请你指明你所指的“初始化”
引用 1 楼 mougaidong 的回复:

你用Release版本看看结果是多少

再者,是0不代表就一定初始化了。


初始化 这个概念是在标准当中有规定的,不是我所指的。

其意思是,在你的进程中第一次为某一个变量对应的内存赋值。

作者: mougaidong   发布时间: 2011-11-29

VS2005运行显示结果:
-842150451

作者: vvviippp   发布时间: 2011-11-29

我只是粗略的了解,在malloc返回之后,会有相关的简单的清空操作,
就拿我这里分配给p的4个字节,会进行简单的清除操作。
所以,给int,就输出0了。

初始化我是知道的。但是malloc明显不能初始化,但是作者又提出这个不能初始化,
我是没有个参考了才有这个疑问。

引用 14 楼 mougaidong 的回复:

引用 6 楼 gyongheng 的回复:

我就是纠结在“初始化”这三个字的具体含义上。
烦请你指明你所指的“初始化”
引用 1 楼 mougaidong 的回复:

你用Release版本看看结果是多少

再者,是0不代表就一定初始化了。


初始化 这个概念是在标准当中有规定的,不是我所指的。

其意思是,在你的进程中第一次为某一个变量对应的内存赋值。

作者: gyongheng   发布时间: 2011-11-29

谢谢,看来这个跟环境有所关系的。
引用 15 楼 vvviippp 的回复:

VS2005运行显示结果:
-842150451

作者: gyongheng   发布时间: 2011-11-29

应该是恰巧等于0。在VS下是个负数,你查看一下变量信息吧!

作者: kf44444   发布时间: 2011-11-29

楼主用不着纠结这个吧..这里完全有可能"恰好"等于任何可能的值.

作者: menzi11   发布时间: 2011-11-29

偷着上来看一眼。
内存中就没有恰好等于0这个数这一说,如果是一堆无意义的数字,那还可能是恰好。
那代表编译器什么都没做,直接取出一块内存,但如果是0这个数字的话,那只可能是编译器去额外做的工作。
另外楼主,你反复跟我强调GCC什么的,你觉得有意义么?
GCC是什么,还不就是编译器么。
看你17楼的回答,最后整句看来是跟环境有关系,不知道你认为这个环境是否是"编译器"呢?

作者: mymixing   发布时间: 2011-11-29

malloc只是一个借口,根据系统内核的实现不同而不同、

作者: kingstar158   发布时间: 2011-11-29

难道楼主不知道RAM中每一个字节在电脑加电后都有值吗?

作者: zhao4zhong1   发布时间: 2011-11-29

原谅我根据你的头像称你做“大叔”,
大叔你说得是实现主存的物理特性。我知道。
但是我无法从你说得话归约到我想问的。
烦请详细讲解。鄙人菜鸟

引用 22 楼 zhao4zhong1 的回复:

难道楼主不知道RAM中每一个字节在电脑加电后都有值吗?

作者: gyongheng   发布时间: 2011-11-29

也烦请你不要贴未经任何加工的英文,我怕了。
引用 22 楼 zhao4zhong1 的回复:

难道楼主不知道RAM中每一个字节在电脑加电后都有值吗?

作者: gyongheng   发布时间: 2011-11-29