- 博客(36)
- 收藏
- 关注
原创 【三两波折】char *foo[]和char(*foo)[]有何不同?
指的是一个大小为3的数组,数组存的是char *,通过foo[i]或*(foo + i)可以读取到对应为止的值。取址运算符已经和foo优先结合了,foo一定是一个指针。这个指针指向一个地址,这个地址是1*3大小的数组 [char][char][char]。定义了一个数组,大小是x,数组里存的是type类型。数组下标优先级最高,结合方式“左到右”,因此等价于“char *定义了一个数组foo,大小是3,数组里存的是。答:定义了一个数组,大小是3,数组里存的是int 类型。&ch:指向整个数组的指针。
2024-03-10 22:15:05 401
原创 C语言中的整数安全:溢出、回绕
无符号数永远不会溢出,只是在无限的循环往复。对于加法、乘法,假装有额外的有效位来承载运算结果,最后再直接截断。加法例子减法例子。
2024-01-25 23:29:14 474
原创 可执行文件为什么又叫映像文件image?——程序员的自我修养——链接、装载与库》笔记
直到启动运行,可执行文件中的指令、数据都没有被装入内存中。OS仅通过可执行文件头部的信息建立起“可执行文件”和进程虚存之间的映射关系。举例子:身份证就是一种映射关系,我的身份证是“鹅城”给我发的,我并不需要真的在“鹅城”,但通过这个身份证的映射又真的能找到我。“可执行文件”与“执行该可执行文件进程的虚拟空间”存在着一种映射关系,这种映射关系只是保存在OS内部的一个数据结构。“可执行文件在装载时实际上是被映射的虚拟空间” —— 《程序员的自我修养——链接、装载与库》
2024-01-22 23:42:32 378
原创 未初始化的全局变量为什么可以认为放在.bss 段?
未初始化的全局变量是弱符号。编译成.o时,占的大小是未知的,有可能别的地方还定义了,且定义的size更大。但是链接器是要符号判决的,是能知道大小的,最终在bss段为其分配空间(可执行文件)。目标文件中,没有在.bss段分配空间,而是标记为COMMOM。
2024-01-21 23:30:46 379
原创 程序员的自我修养-笔记
4、链接之前,.o的VMA都是0,因为虚拟空间还没有分配。链接之后,可执行文件各个段就分到相应的虚拟地址。链接器在完成地址、空间分配之后,就可以确定所有符号的虚拟地址了,然后就可以对需要重定位的进行地址修正了。代码引用了外部代码、符号,对应.o“.rel.text”代码段的重定位表,“.rel.data”数据段的重定位表。2、链接器为目标文件分配地址和空间,.test、.data在可执行文件及装载后的虚拟地址中均占空间;1、.bss 在目标文件、可执行文件中并不占用空间,但在装载时占用地址空间。
2024-01-21 23:19:53 440
原创 优化程序性能
1、选择一组适当的算法和数据结构;编写编译器能有效优化以转换成高效可执行代码的源代码。2、编写的一小点变化,都会引起编译器优化方式的很大变化。3、消除不必要的函数调用、条件测试、内存引用。
2024-01-17 23:22:31 281
原创 《嵌入式C语言自我修养》第四章笔记
编译过程,将程序翻译成CPU能够识别和运行的二进制机器指令的过程。 从源程序到二进制文件的过程,很有意思 一个可执行文件中的每一个section都有一个section header,将这些section headers集中放到一起,就是section header table,翻译成中文就是节头表。section header描述各个section的名称、类型、起始地址、大小等信息。程序运行时,加载器会根据ELF header来获取可执行文件信息。 未初始化的全局变量和静态变量会放置在BSS段中,但是
2024-01-11 20:47:03 331
原创 谈谈寄存器
寄存器在CPU内部,用来暂存指令、数据,利用寄存器会非常的快,通常在一个CPU时钟周期就可以完成。控制器负责把内存上的指令、数据等读入寄存器,并根据指令的执行结果来控制整个计算机。CPU的内部一般由:寄存器、控制器、运算器和时钟组成。“机器语言级别的程序是通过寄存器来处理的” —— 《程序是怎么跑起来的》矢泽久雄。通过汇编/反汇编,可以发现寄存器大量参与我们的程序运行。从内存读入寄存器的数据。时钟负责发出CPU开始计时的时钟信号。—— 《程序是怎么跑起来的》矢泽久雄。寄存器可以看做内存的一种。
2024-01-04 23:38:48 412 1
原创 一次看透const
a、#defineb、const#define修饰的符号名称是一个真量数值,而const修饰的栈常量,是一个“假”常量。在实际中,使用const定义的栈变量,最终还是一个变量,只是在编译期间对语法进行了检查,发现代码有对const修饰的变量存在直接修改行为则报错。——《C++反汇编与逆向分析技术揭秘》const 修饰的变量,根据实测,要区分是局部变量还是全局变量。如下图所示全局变量g_val,虽然我们通过指针转换,绕过了编译器检查,但实际在写入操作时,引发异常。
2023-12-24 22:05:13 1097 2
原创 static 变量是怎样对外不可见的?
a、只能在当前文件内使用。—— 由编译器在编译之前进行语法检查,来保证。b、其他店同全局变量相同—— 内存结构、访问原理。
2023-12-24 18:04:26 511 1
原创 怎么快速记住大端、小端
0x12 | 0x34| ... |... 这样的,跟我们阅读习惯一样的,从左到右,从地地址到高地址的,就是大端(符合我们阅读习惯)跟我们阅读习惯不太相符的,0x78, 0x56, 0x34, 0x12 就是小端。比如 0x12345678。假设地址从左到右:依次增高。
2023-12-20 22:33:40 463
原创 编译和链接【未完待续】
扫描(词法分析)-语法分析(检查表达式是否合法)-语义分析(静态语义通常包括声明和类型匹配、类型的转换;动态语义:运行期出现的语义相关问题,比如除0)-源代码优化-代码生成-目标代码优化。编译Compilation:词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件。汇编Assembly:将汇编代码转换成机器可以执行的指令。构建:编译和链接合并到一起的过程。预处理Prepressing。
2023-12-17 13:47:49 421 1
原创 【Cpp】new、delete
1、假设Cat代表各种类型(int、char、float、double、NodeStruct(结构体)、NodeClass(类)、...)3、new、delete 可以被重载。2、new —— 堆上进行分配。
2023-09-24 20:28:37 25
原创 【Cpp】左值、右值、引用、移动函数
内存区域可以理解为左值,存的值可以理解为右值, 变量可以即为左值又为右值(读取该变量所代表内存的数据)。4、左值指内存区域,放在“=”左边,将右边表达式的计算结果写入内存,只是用变量名来代表内存区域;此时age 用的是它的右值属性。1、放在赋值语句左边的变量 —— 左值;5、对变量的修改都要通过左值(写入到内存,更新值)参看:《C++面向对象程序设计》3、变量包含两个要素。
2023-09-24 15:37:33 204
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人