• [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 ! 
  • 相关阅读:
    SQL学习笔记六之MySQL数据备份和pymysql模块
    SQL学习笔记五之MySQL索引原理与慢查询优化
    SQL学习笔记四之MySQL数据操作
    SQL学习笔记四(补充-2)之MySQL多表查询
    SQL学习笔记四(补充-2-1)之MySQL SQL查询作业答案
    SQL学习笔记四(补充-1)之MySQL单表查询
    SQL学习笔记四(补充-1-1)之MySQL单表查询补充部分:SQL逻辑查询语句执行顺序
    Python Web学习笔记之为什么设计GIL
    SQL学习笔记三之MySQL表操作
    buffer小解
  • 原文地址:https://www.cnblogs.com/robbychan/p/3786730.html
Copyright © 2020-2023  润新知