摘要:
函数参数: 函数参数的求值顺序依赖于编译器的实现: 第一感觉,这个函数会输出1和2,k的最终值会变成3。 示例程序: 运行结果如下: 这与我们的预期是不符的,这是为什么呢? 因为函数参数的求值顺序是和编译器相关的,并没有规定第一个k++先求职,第二个k++后求职。只是规定了参数的值必须求出来之后才进
阅读全文
posted @ 2018-08-30 00:03
周伯通789
阅读(194)
推荐(0)
摘要:
函数的由来: 模块化程序设计: C语言中的模块化: 面向过程的程序设计: 函数的声明和定义: 声明和定义是不同的。示例如下: global.c如下: 第4行说明g_var在其它文件中定义,在这里不会再分配存储空间。第6行声明有struct Test这样一个结构体(并不是声明变量),这里是告诉编译器在
阅读全文
posted @ 2018-08-29 23:23
周伯通789
阅读(188)
推荐(0)
摘要:
常见内存错误: 两次释放同一个指针是有问题的。 示例: 13行和41行两次释放了p,会导致程序崩溃。21行如果是奇数直接返回,也会导致问题。 运行如下: 在哪个函数申请的内存就在哪个函数释放。 free不能释放栈上的空间,否则产生段错误。 示例程序: 11、12定义结构体变量时,内部的指针没有初始化
阅读全文
posted @ 2018-08-29 22:46
周伯通789
阅读(136)
推荐(0)
摘要:
野指针: 野指针的由来: 示例程序: 第13行越界之后就相当于操作野指针了。第8行将随意一个地址转换为指针,也相当于野指针。 运行结果如下: 基本原则: 示例: 第15行返回局部字符数组,是不正确的。结构体s中的name没有初始化,s.name和p都是野指针。 34-36行的内存拷贝也会产生越界。和
阅读全文
posted @ 2018-08-29 22:21
周伯通789
阅读(163)
推荐(0)
摘要:
程序文件的一般布局: 加载程序加载文件时,根据文件头信息就可以知道这是一个什么样的文件。知道了是什么样的可执行程序就知道怎么运行它了。 程序与进程: 面试中的小问题: 包含脚本代码的文本文件是一种类型的可执行程序吗?如果是,对应什么样的进程呢? 脚本代码是可执行程序,但不是直接的可执行程序,是解释执
阅读全文
posted @ 2018-08-29 21:50
周伯通789
阅读(192)
推荐(0)
摘要:
程序中的栈: 函数调用过程: 函数调用栈的变化: ebp的作用就是用来进行函数调用的返回的。 函数返回仅仅是修改了esp指针,栈中的数据不会立即改变。 函数调用栈上的数据: g返回后,a数组的数据已经没有意义了。 示例: g返回后,a中的数据就会改变了,示例如下; 第23行调用printf时已经将栈
阅读全文
posted @ 2018-08-28 23:30
周伯通789
阅读(209)
推荐(0)
摘要:
动态内存分配的意义: malloc和free: 注意: 思考: malloc(0)将返回什么? 运行结果如下: 可以看到,返回了具体的地址。 我们所说的内存包括起始地址和长度。我们平时说内存的时候更多的是关注起始地址,而忽略了长度。 如果动态的综合这两部,我们使用malloc(0)返回了一个地址就不
阅读全文
posted @ 2018-08-28 22:29
周伯通789
阅读(219)
推荐(0)
摘要:
问题: 指针阅读技巧解析: 示例: 解析如下: 最后一个指针p5用typedef定义如下: 工程中复杂指针尽量用typedef定义。 小结:
阅读全文
posted @ 2018-08-28 22:09
周伯通789
阅读(268)
推荐(0)
摘要:
函数类型: 函数指针: 面试小问题: 如何使用C语言直接跳转到某个固定的地址开始执行? 函数指针的使用: 函数名取不取地址,它的意义是相同的,这和数组不一样。 运行结果如下: 知道了函数地址,我们在18行直接给函数名用地址赋值,结果如下: 我们可以得到结论,C语言中可以直接跳转到某个固定的地址执行。
阅读全文
posted @ 2018-08-28 21:50
周伯通789
阅读(237)
推荐(0)
摘要:
为什么C语言中的数组参数会退化为指针? 退化的意义: 二维数组参数: 等价关系: 知识点: 传递与访问二维数组示例: 53行传递的参数与形参类型不匹配,访问会出现意想不到的结果。55行也是类型不匹配。 注释掉53、55行,运行结果如下: 小结:
阅读全文
posted @ 2018-08-28 00:06
周伯通789
阅读(229)
推荐(0)