[OS] 我与大牛的对话!

hp'<aclay@qq.com> 9:12:29
不new 出来,就这样,char *p, 在主函数中,那么这个p可能都指向哪里
ftiasch(826513189) 9:12:51
随机指向一块内存地址。
hp'<aclay@qq.com> 9:13:56
指向的内存地址,是不是只有可能是 堆,全局区,常量区,自由存储区?这4个
R(305146787) 9:31:31
char *p,是临时的指针变量,肯定存在自由存储区
hp'<aclay@qq.com> 9:36:33
int main() {
int *p;
*p = 3;
printf("%d", *p);
return 0;
}
那么这个程序会输出什么结果呢?是总是输出3还是有时输出3有时候崩溃
还是直接崩溃呢
R(305146787) 9:38:11
这个肯定会有问题的
p指向的地址并不清楚,你就对其赋值
可能会出现段异常的错误
hp'<aclay@qq.com> 9:39:05
你不是说p一定指向自由存储区么
这个程序,是我面试的时候遇到的,我用程序试,每次都输出3
R(305146787) 9:40:01
是的,但是具体的指向并不清楚
也就是具体地址不清楚,在你这个程序
实际上在windows的程序上来说
每个程序有2G的私有内存
所以即使你这么写,因为内存空间很大
R(305146787) 9:41:06
所以p随机指向的那个地址未必是一个非法地址
因而你可以这么赋值
但请记住,这么写是非法的
通俗来说,是运气导致了程序正常
hp'<aclay@qq.com> 9:42:52
哦!
R(305146787) 9:43:05
这么说吧,语法上是错的,但是实际windows程序的私有内存很大,随机的那个地址很可能未被使用,所以你这个程序侥幸成功了
如果是在一些小型的设备上进行编程
hp'<aclay@qq.com> 9:43:33
char *p,是临时的指针变量,肯定存在自由存储区

R(305146787) 9:43:54
你在main函数中定义的临时变量而已
hp'<aclay@qq.com> 9:44:01
是什么意思?是p所占的内存是在 自由存储区,还是p指向的内存在自由存储区
R(305146787) 9:44:17
p是一个变量,这个变量在自由存储区
而这个变量初始化的值,也就是其指向的内存地址不确定
R(305146787) 9:45:23
如果不是静态变量,编译器对其初始化的值都是不确定的
R(305146787) 9:46:54
一开始指向哪里并不确定,比如你如果让这个指针指向一个静态变量,那就在静态存储区
hp'<aclay@qq.com> 9:47:34
全局存储区是不是和静态存储区是一个地方?
R(305146787) 9:47:50
是的
hp'<aclay@qq.com> 9:48:07
临时变量,char *p, 这不是局部变量么?局部变量不是分配在栈上么
R(305146787) 9:48:42
栈是指内存中的存储区域
程序未运行之前,编译器会把这个标记为局部变量
非静态局部变量运行时在栈中分配内存
R(305146787) 9:50:11
堆和栈都是指运行时在内存中怎么分配
hp'<aclay@qq.com> 9:50:26
那自由存储区?临时变量
R(305146787) 9:50:28
而全局,局部这些是在编译时确定的
hp'<aclay@qq.com> 9:50:34

R(305146787) 9:50:53
不要把运行时的地址和语法规定的部分混淆理解
hp'<aclay@qq.com> 9:53:29
那你的意思是不是就是 int i (在main中); 未运行的时候在自由存储区,运行的时候在栈上
R(305146787) 9:53:36
是的
hp'<aclay@qq.com> 9:53:36
我有点懵

R(305146787) 9:54:16
自由存储区是编译器标记的属性,然后运行时在内存,这些变量就在系统栈上分配空间
hp'<aclay@qq.com> 9:54:41
未运行也分配内存了么?自由存储区不是内存中的一部分么
未运行那变量也没占内存呀!那变量不是在硬盘上么
恕我知识浅薄
R(305146787) 9:55:51
编译器会预先标记某些变量将来需要多大内存
比如你声明的一个数组
hp'<aclay@qq.com> 9:56:10

R(305146787) 9:56:26
而有些变量运行时才确定需要多大内存
hp'<aclay@qq.com> 9:56:36
是在自由存储区标记的?他将来来占多大内存
要占
R(305146787) 9:56:41
是的
hp'<aclay@qq.com> 9:56:43

R(305146787) 9:56:48
这些都是固定的
hp'<aclay@qq.com> 9:56:55
自由存储区就是干这个的,受教了
R(305146787) 9:57:39
很复杂的东西,如果要彻底理解,就需要理解C语言之类的内存模型为何
你只需要记住这些概念的大概意思就可以了
R(305146787) 9:58:54
如果继续深入的话,就相当于你在学如何设计一个编程语言
hp'<aclay@qq.com> 9:59:16
o ! 
原文地址:https://www.cnblogs.com/robbychan/p/3786730.html