typedef和宏文本替换的重要区别:
首先,可以用其它类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这样做。
其次,在连续几个变量的声明中,用typedef定义的类型能够保证声明中所有的变量均为同一种类型,而用#define定义的类型则无法保证。
编译器位于编译过程的哪一个阶段?
绝大多数编译器并不是一个单一的庞大程序。它们通常是由六七个稍小的程序所组成,这些程序由一个叫做“编译器驱动器的控制程序来调用”。分离出来的单独程序包括:与处理器、语法和语义检查器、代码生成器、汇编程序、优化器、连接器,当然还包括一个调用所有这些程序并向各个程序传递正确选项的驱动器程序。优化器几乎可以加载上述所有阶段的后面。
如果函数库的一份拷贝是可执行文件的物理组成部分,我们称之为静态链接,如果可执行文件只是包含了文件名,让载入器在运行时能够寻找所需要的函数库,那么我们称之为动态链接。
动态链接可执行文件比功能相同的静态链接可执行文件的体积小。
所有动态连接到某个特定函数库的可执行文件在运行时共享该函数库的一个单独拷贝。动态链接库由链接编辑器ld创建。根据约定,动态库的文件扩展名为“.so”,表示“shared object(共享对象)”——每个连接到该函数库的程序共享它的同一份拷贝。
作为80x86内存模型最基本的形式 ,8086中的段是一块64K的内存区域,由一个段寄存器所指向。内存地址的形成经过是:取得段寄存器的值,左移4位,或者换种思路,把段寄存器的值看成是20位的,也就是在值的右边扩充4个0。然后就是16位的偏移地址,它表示段内的地址。如果把段寄存器的值(经过移位) 。
你可以分配多大的内存:
//
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int MB = 0;
while (malloc(1 << 20)) ++MB;
printf("Allocated %d MB total\n", MB);
return 0;
}
//
什么时候数组和指针是相同的
规则一:表达式中的数组名(与声明不同)被编译器当作一个指向指向该书组第一个元素的指针。
规则二:下标总是与指针的偏移量相同。
规则三:在函数参数的声明中,数组名被编译器当作指向该数组第一个元素的指针。