请教一个 C 语言内存分配的问题

2018-05-27 12:39:47 +08:00
 whoami9894

C 语言的malloc()函数分配的是应该算是动态内存还是自动内存?我记得应该是动态内存,只要我没有 free,它就一直存在。但我在 void 函数中初始化一块内存,函数调用结束后这个指针也变成未定义了,难道这里分配的内存作用域只在函数内部吗

3402 次点击
所在节点    C
36 条回复
ipwx
2018-05-27 16:44:09 +08:00
操作系统不会无缘无故把一块物理内存给某个进程,有需要的话,要申请。

但是每次向操作系统都申请太慢了,所以各编程语言其实是一大块一大块地向操作系统申请的。

每次有个小内存的 malloc,编程语言先试图从已经申请但没有用的内存里面切一块给用户程序。如果不够,再向操作系统申请。

而所有已经向操作系统申请的大块内存、以及切分方案,各个编程语言在全局变量空间自行维护。

函数里面的临时内存空间那是栈空间,不归 malloc 和编程语言的这套机制管。
whoami9894
2018-05-27 16:48:16 +08:00
@zhicheng
……那段代码是告诉他我当时理解的错误。贴子主体就说了编译器会报未定义。
whoami9894
2018-05-27 16:51:13 +08:00
@rosu
那段代码局部 int 和指针变量会随函数销毁,我的理解错误是没分清指针和内存,就像楼上说的没区分指针变量和内存的值
zhicheng
2018-05-27 18:30:40 +08:00
@whoami9894 不要强行去解释。

未定义错误和销不销毁没有关系,未定义错误是编译时期的事。你本来就理解错了,就不要用另一种错的方式去理解。建议还是看看书,一个字一个字的看,不要跳着看。
afpro
2018-05-27 18:31:45 +08:00
这和内存没什么关系吧 明显是楼主还没分清内存和指针的关系
whoami9894
2018-05-27 18:54:10 +08:00
@zhicheng
我用哪种错误方式去理解了?
我最开始是想着定义 void 函数分配一块内存,认为内存会一直存在,这里没分清楚指针和内存,错误认为函数内定义的指针等同于函数内定义的内存一样会一直存在直到 free。说到底不是变量作用域存活周期那些问题,是指针和内存问题
whoami9894
2018-05-27 18:59:45 +08:00
@afpro
你在说哪儿
zhicheng
2018-05-27 19:00:17 +08:00
@whoami9894 我说了 9 楼的代码是错的呀,如果你觉得那个代码没错,那 You are right.
whoami9894
2018-05-27 19:11:00 +08:00
@zhicheng
我发这个贴子就是因为理解错误所以写出那样的代码,之后你又说我在强行解释,"用另一种错误方法理解"。接着我问你是哪种错误方式,你又兜回 9l,我从没说 9l 是对的吧大哥,就是因为它错了我才来发帖问的。
zhicheng
2018-05-27 19:12:00 +08:00
@whoami9894 你是对的。
liuhaotian
2018-05-27 19:16:49 +08:00
@zhicheng #24
@afpro #25
@whoami9894 #22

只有我一个人觉得 9#的代码最大的问题是变量作用域的问题吗

编译器里报的未定义 是 not declared variable,准确来说是 变量未声明
而上面几位说的未定义 ub 是 undefined behavior
似乎楼主认为这两个未定义是同一个东西了
zhicheng
2018-05-27 19:20:37 +08:00
@liuhaotian 其实我想了一下,觉得他大概看书看到赋值那一章就能搞懂了。
whoami9894
2018-05-27 19:22:53 +08:00
@liuhaotian
对啊,指针变量的作用域只在函数内部。我没分清指针变量和内存,以为**指针**这个变量像**动态内存**一样。就是因为理解有问题.....有点说不清
OneNian
2018-05-27 19:26:57 +08:00
先把 C 语言基础看完。(加油吧这基础差的有点多)
OneNian
2018-05-27 19:28:41 +08:00
main 里声明一个指针变量,函数 return 地址。

方法有很多。不急。多看书做题
pkookp8
2018-05-27 20:45:53 +08:00
白看了好久。。。9 个字,自己搜吧
局部变量和全局变量

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/458095

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX