文章目录
- 1. 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?
- 2. 简述C、C++程序编译的内存分配情况
- 3. 简述strcpy、sprintf 与memcpy 的区别
- 4. 解析`(*(void (*)( ) )0)( )`的含义
- 5. C语言的指针和引用和c++的有什么区别?
1. 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?
- 全局变量是整个程序都可访问的变量,谁都可以访问,生存期在整个程序从运行到结束(在程序结束时所占内存释放);
- 而局部变量存在于模块(子程序,函数)中,只有所在模块可以访问,其他模块不可直接访问,模块结束(函数调用完毕),局部变量消失,所占据的内存释放。
- 操作系统和编译器,可能是通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面;
2. 简述C、C++程序编译的内存分配情况
- 从静态存储区域分配:
内 存 在 程 序 编 译 时 就 已 经 分 配 好 , 这 块 内 存 在 程 序 的 整 个 运 行 期 间 都 存 在 。 速 度 快 、 不 容 易 出 错 , 因 为 有 系 统 会 善 后 。 例 如 全 局 变 量 , s t a t i c 变 量 , 常 量 字 符 串 等 。 - 在栈上分配:
在 执 行 函 数 时 , 函 数 内 局 部 变 量 的 存 储 单 元 都 在 栈 上 创 建 , 函 数 执 行 结 束 时 这 些 存 储 单 元 自 动 被 释 放 。 栈 内 存 分 配 运 算 内 置 于 处 理 器 的 指 令 集 中 , 效 率 很 高 , 但 是 分 配 的 内 存 容 量 有 限 。 大 小 为 2 M 。 - 从堆上分配:
即 动 态 内 存 分 配 。 程 序 在 运 行 的 时 候 用 m a l l o c 或 n e w 申 请 任 意 大 小 的 内 存 , 程 序 员 自 己 负 责 在 何 时 用 f r e e 或 d e l e t e 释 放 内 存 。 动 态 内 存 的 生 存 期 由 程 序 员 决 定 , 使 用 非 常 灵 活 。 如 果 在 堆 上 分 配 了 空 间 , 就 有 责 任 回 收 它 , 否 则 运 行 的 程 序 会 出 现 内 存 泄 漏 , 另 外 频 繁 地 分 配 和 释 放 不 同 大 小 的 堆 空 间 将 会 产 生 堆 内 碎 块 。 一 个 C 、 C + + 程 序 编 译 时 内 存 分 为 5 大 存 储 区 : 堆 区 、 栈 区 、 全 局 区 、 文 字 常 量 区 、 程 序 代 码 区 。
3. 简述strcpy、sprintf 与memcpy 的区别
- 操作对象不同,strcpy 的两个操作对象均为字符串,sprintf 的操作源对象可以是多种数据类型, 目的操作
对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。 - 执行效率不同,memcpy 最高,strcpy 次之,sprintf 的效率最低。
- 实现功能不同,strcpy 主要实现字符串变量间的拷贝,sprintf 主要实现其他数据类型格式到字 符串的转
化,memcpy 主要是内存块间的拷贝。
注 意 : s t r c p y 、 s p r i n t f 与 m e m c p y 都 可 以 实 现 拷 贝 的 功 能 , 但 是 针 对 的 对 象 不 同 , 根 据 实 际 需 求 , 来 选 择 合 适 的 函 数 实 现 拷 贝 功 能 。
4. 解析(*(void (*)( ) )0)( )
的含义
5. C语言的指针和引用和c++的有什么区别?
- 指针有自己的一块空间,而引用只是一个别名;
- 使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;
- 作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引 用的修改都会改变引用所指向的对
象; - 可以有const指针,但是没有const引用;
- 指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能 被改变;
- 指针可以有多级指针(**p),而引用止于一级;
- 指针和引用使用++运算符的意义不一样;
- 如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。