C语言高级

gcc的编译过程

1.预处理:
	展开头文件、宏替换等,处理一切预处理指令(凡是以#号开头的语句)
	头文件的作用:声明了函数原型(以便于编译器检测传参)、声明了外部全局变量、定义了数据结构和宏等。
2.编译:
	进行语法、语义、词法分析,最终把C语言程序编译成汇编语言程序。
3.汇编:
	进行语法、语义、词法分析,最终把汇编语言程序汇编成机器码。
4.链接:
	将程序的段内偏移地址重定位为线性地址,根据符号表链接静态运行库或目标文件。

二进制代码工具

objdump:       反汇编、查看二进制代码等
nm :                查看程序符号表
readelf:        查看ELF格式程序信息
size:                查看ELF格式程序的段大小。

程序调试工具

gdb:            命令行代码调试工具
ddd:            图形界面下代码调试工具(依赖gdb)
valgrind:        内存检测工具, 可发现内存泄漏

================= 结构体 ========================

结构体: 构造一种新的数据类型,用来对已有的数据进行封装。
函数: 编写一段代码,对程序功能模块进行封装。
封装一个学生的基本信息:
姓名
学号
性别
分数
一、定义结构体类型及变量的定义方法:
1.分别定义结构体类型和变量:
struct 类型名 {
成员1;
成员2;
成员3;

};
例如:
struct student {
int num;
char name[32];
char sex;
int score;
};
定义结构体变量的方法:
struct 结构体类型 变量名;
例如:
struct student stu;

2.在定义类型的同时,定义变量(不推荐!不符合编程规范):
struct 类型名 {
成员1;
成员2;
成员3;

}变量1, 变量2 …;
例如:
struct student {
int num;
char name[32];
char sex;
int score;
}stu1, stu2;
二、结构体变量的赋值或初始化:
1.定义后赋值:
结构体变量是一个集合,对该变量的访问时需要指明访问哪个成员,方法是:
结构体变量名.成员名 = 值;
例如:
stu.num = 20140505;
stu.score = 100;
对成员访问时要考虑到成员本身的属性,例如:
stu.name = “james” /* 错误 /
strcpy(stu.name, “james”); /
正确 */
其中name成员是一个字符数组,因此不能直接赋值,要用字符串拷贝函数。
2.初始化:
和普通变量一样,结构体可以在定义时初始化(可以整体赋值); 一旦定义完毕则禁止整体赋值(和数组类似)。
方法:
struct 类型名 {
成员1;
成员2;
成员3;

}变量1 = {
成员1的值, /注意初始化顺序要和成员顺序一一对应,不可跨越/
成员2的值,
成员3的值,
… /*末尾的N个成员可以不赋值,默认被初始化为0(跟数组类似) /
};
例如:
struct student {
int num;
char name[32];
char sex;
int score;
}stu1 = { /
此种形式太过复杂,可读性不高,不建议使用 /
20140505,
“james”,
‘m’,
100, /
末尾的 ,号可有可无 */
};

struct student stu2 = {
20140505,
“james”,
‘m’,
100,
};

内存对齐

内存对齐规则:
内存对齐有三种单位: 字、半字、字节。
宽度为4B的数据要存放在能够被4整除的地址上。 (例如32位系统中的int、long)
宽度为2B的数据要存放在能够被2整除的地址上。 (例如32位系统中的short)
宽度为1B的数据要存放在能够被1整除的地址上(任意存放)。 (例如char)
结构体的整体大小是其中最大基本类型的整数倍(如果基本类型的大小超过了系统的字长,则按系统字长计算。例如double)。

============== 内存管理===========================

程序的数据存储:
栈区: stack
内存属性:读写
产生时间:运行后
存储对象:自动型局部变量。
生命周期:同所在函数的生命周期。
堆区: heap
内存属性:读写
产生时间:malloc后。
存储对象:所有用户数据。
生命周期:malloc后,free前。
常量区: rodata(const)
内存属性:只读;
产生时间: 编译后。
存储对象:字符串常量、被const修饰的静态变量(被const修饰的auto变量不会放在该区域)。
生命周期:同该进程的生命周期。
静态区: data(static)
内存属性:读写
产生时间:编译后
存储对象:全局变量、static修饰的变量。
生命周期:同该进程的生命周期。
代码区: text
内存属性:只读、可执行。
产生时间:编译后
存储对象:指令。
生命周期:同该进程的生命周期。

static作用:
	1.限定作用域:
		凡是被static修饰过的任何函数、变量都只允许在本文件使用,不对外链接。
	2.限定存储域:
		凡是被static修饰过的数据,都放在静态区。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. C 语言中的指针和内存泄漏 ............................................................................................................. 5 2. C语言难点分析整理 .......................................................................................................................... 9 3. C语言难点 ........................................................................................................................................ 16 4. C/C++实现冒泡排序算法 ................................................................................................................. 29 5. C++中指针和引用的区别 ................................................................................................................. 31 6. const char*, char const*, char*const的区别 ..................................................................................... 32 7. C中可变参数函数实现 .................................................................................................................... 34 8. C程序内存中组成部分 .................................................................................................................... 37 9. C编程拾粹 ........................................................................................................................................ 38 10. C语言中实现数组的动态增长 .................................................................................................... 40 11. C语言中的位运算 ........................................................................................................................ 41 12. 浮点数的存储格式: .................................................................................................................... 45 13. 位域 ................................................................................................................................................ 52 14. C语言函数二维数组传递方法 .................................................................................................... 58 15. C语言复杂表达式的执行步骤 .................................................................................................... 60 16. C语言字符串函数大全 ................................................................................................................ 62 17. C语言宏定义技巧 ........................................................................................................................ 80 18. C语言实现动态数组 .................................................................................................................... 89 19. C语言笔试-运算符和表达式 ....................................................................................................... 93 20. C语言编程准则之稳定篇 ............................................................................................................ 96 21. C语言编程常见问题分析 ............................................................................................................ 97 22. C语言编程易犯毛病集合 .......................................................................................................... 101 23. C语言缺陷与陷阱(笔记) ............................................................................................................ 107 24. C语言防止缓冲区溢出方法 .......................................................................................................113 25. C语言高效编程秘籍 ...................................................................................................................115 26. C运算符优先级口诀 ...................................................................................................................119 27. do/while(0)的妙用 ....................................................................................................................... 120 28. exit()和return()的区别 ................................................................................................................ 125 29. exit子程序终止函数与return的差别 ........................................................................................ 126 30. extern与static存储空间矛盾 ..................................................................................................... 130 31. PC-Lint与C\C++代码质量 ........................................................................................................ 132 32. spirntf函数使用大全................................................................................................................... 142 33. 二叉树的数据结构 ...................................................................................................................... 150 34. 位运算应用口诀和实例 .............................................................................................................. 153 35. 内存对齐与ANSI C中struct内存布局 .................................................................................... 156 36. 冒泡和选择排序实现 .................................................................................................................. 162 37. 函数指针数组与返回数组指针的函数 ...................................................................................... 168 38. 右左法则- 复杂指针解析 ........................................................................................................... 170 39. 回车和换行的区别 ...................................................................................................................... 173 40. 堆和堆栈的区别 .......................................................................................................................... 175 41. 堆和堆栈的区别 .......................................................................................................................... 178 42. 如何写出专业的C头文件 ......................................................................................................... 181 43. 打造最快的Hash表 .................................................................................................................... 185 44. 指针与数组学习笔记 .................................................................................................................. 199 45. 数组不是指针 .............................................................................................................................. 201 46. 标准C中字符串分割的方法 ..................................................................................................... 205 47. 汉诺塔源码 .................................................................................................................................. 208 48. 洗牌算法 .......................................................................................................................................211 49. 深入理解C语言指针的奥秘 ..................................................................................................... 213 50. 游戏外挂的编写原理 .................................................................................................................. 229 51. 程序实例分析-为什么会陷入死循环 ......................................................................................... 232 52. 空指针究竟指向了内存的哪个地方 .......................................................................................... 234 53. 算术表达式的计算 ...................................................................................................................... 238 54. 结构体对齐的具体含义 .............................................................................................................. 242 55. 连连看AI算法 ............................................................................................................................ 246 56. 连连看寻路算法的思路 .............................................................................................................. 254 57. 重新认识:指向函数的指针 ......................................................................................................... 258 58. 链表的源码 .................................................................................................................................. 261 59. 高质量的子程序 .......................................................................................................................... 264 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解.................................................... 266 61. C语言常见错误 .......................................................................................................................... 286 62. 超强的指针学习笔记 .................................................................................................................. 291 63. 程序员之路──关于代码风格 .................................................................................................. 306 64. 指针、结构体、联合体的安全规范 .......................................................................................... 309 65. C指针讲解 .................................................................................................................................. 314 66. 关于指向指针的指针 .................................................................................................................. 327 67. C/C++ 误区一:void main() ...................................................................................................... 331 68. C/C++ 误区二:fflush(stdin) ..................................................................................................... 334 69. C/C++ 误区三:强制转换 malloc() 的返回值 ........................................................................ 338 70. C/C++ 误区四:char c = getchar(); ............................................................................................ 339 71. C/C++ 误区五:检查 new 的返回值....................................................................................... 341 72. C 是 C++ 的子集吗? .............................................................................................................. 342 73. C和C++的区别是什么? .......................................................................................................... 345 74. 无条件循环 .................................................................................................................................. 346 75. 产生随机数的方法 ...................................................................................................................... 347 76. 顺序表及其操作 .......................................................................................................................... 348 77. 单链表的实现及其操作 .............................................................................................................. 349 78. 双向链表 ...................................................................................................................................... 353 79. 程序员数据结构笔记 .................................................................................................................. 357 80. Hashtable和HashMap的区别.................................................................................................... 364 81. hash 表学习笔记 ......................................................................................................................... 366 82. C程序设计常用算法源代码 ...................................................................................................... 368 83. C语言有头结点链表的经典实现 .............................................................................................. 375 84. C语言惠通面试题 ...................................................................................................................... 383 85. C语言常用宏定义 ...................................................................................................................... 402

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值