面试题(7)

1、malloc和free是标准库函数,new/delete是C++运算符

2、static:函数体内的变量;模块内(函数体外)的变量,模块内函数

3、引用定义时必须初始化,指针可以不用;引用初始化后不能被改变,指针可以改变所指的对象;不存在指向空值得引用,但是存在指向空值的指针

4、从标准库的路径去搜寻和引用file.h,而后者是从当前工作路径搜寻并引用file.h

5、

  • 栈区:编译器自动分配释放,存放函数的参数值,局部变量的值等
  • 堆区:一般由程序员分配释放,
  • 全局区(静态区):全局变量和静态变量是放在一起的,初始化的全局变量和静态变量在(.data),未初始化的全局变量和静态变量放在(.bss)
  • 只读数据区(.rodata);字符串常量
  • (.text)程序代码区:存放函数体的二进制代码

6,它是一颗空树或左子树和右子树的高度(深度)差的绝对值不超过1,并且左右子树都为平衡二叉树

7,层次太深的递归调用;使用大数据结构的局部变量

8,构造函数不能声明为虚函数:虚函数的调用需要虚函数表指针,而这个指针存放在对象内存空间中,只有构造函数执行结束后才能初始化虚函数表指针;从继承的概念来讲,首先应该构造父类对象,最后才是构造子类对象,如果父类构造函数声明为虚函数,那么父类构造函数会被覆盖,必须显式调用

9、不能做switch参数的是:实型(float和double),bool; java7支持字符串类型

10,引用头文件的范式或者在需要引用该全局变量的文件调用extern关键声明该变量

11,全局变量可以定义在被多个.c文件包含的头文件中;在不同的C文件中以static形式来声明同名全局变量;前提是只能有一个C文件中对此变量赋初值此时链接不会出错

12、全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式,这两者在存储方式闪并无不同。区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效地;而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一个源程序的其他源文件不能使用它

13、栈区;堆区;全局区(.data和.bss);只读数据区(常量区);代码区

14、申请方式:栈:系统自动分配;堆:程序员自己申请和释放
栈:向低地址扩展的连续内存区域;堆:向高地址扩展,不是连续的内存区域.系统用链表来存储空闲内存地址
在函数调用时,第一个进栈的主函数的下一条指令的地址,然后是函数的参数(从右向左入栈),然后是函数的局部变量,函数调用结束后,出栈

15、预编译又称预处理,主要是做代码文本的替换工作,处理#开头的指令,比如宏定义,条件编译和文件包含,为正式编译前的预备工作
总是使用不经常改动的大型代码体;程序由多个模块组成,所有模块都是用一组标准的包含文件和相同的编译选项

16、关键字const的作用是为读你代码的人传递有用的信息;合理使用const可以使编译器保护哪些不希望被改变的参数,防止其被无意的代码修改

17、层次模型:树结构表示数据之间的关系
网状模型:网状结构表示实体和实体之间的联系,网中的每一个节点代表一个记录类型,联系用链接指针来实现
关系模型:二维表结构来表示实体与实体之间的联系

18、结构体和联合体都是由多个不同数据类型的成员组成,但是在任何同一时刻,联合体只存放了一个成员(所有成员共享一块地址空间),而结构体的所有成员都在(不同成员的存放地址不同)

对联合体的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对结构体的不同成员赋值是互不影响的

19,const:定义常量,修饰函数参数,修饰函数返回值
const常量有数据类型,而宏常量没有数据类型,编译器可以对前者进行类型安全检查,而对后者只进行简单的文本替换,没有类型安全检查
有些集成化的工具可以对const常量进行调试,而不能对宏常量进行调试

20,数组要么在静态存储区被创建(全局数组),要么在栈上被创建;指针可以指向任意类型的内存块
char* p = “world”; //p指向字符串常量
p[0] = ‘X’;//编译不能发现错误,运行时错误

运算符sizeof可以计算出数组的容量,sizeof(p)得到的是指针变量的字节数;c/c++没有办法知道指针所指的内容容量,除非在申请内存时已经确定;当数组作为函数参数进行传递时,该数组自动退化为同类型的指针

21、#ifdef __cplusplus cout << “C++”; #else cout << “C” ; #endif

22、含参数的宏和函数:

  • 含参数的宏:没有参数类型问题;不占用运行时间;预处理;
  • 函数:定义形参、实参类型;调用和返回占用时间;编译和链接

23、设有2个栈A和B,一开始均为空;

  • 入队:将新元素push入栈A;
  • 出队:判断栈B是否为空,如果不为空,则将栈A中所有元素依次pop出栈并push入栈到栈B
  • 将栈B的栈顶元素pop出

24、

#define BIT3  (0x1 << 3)
void set_bit3(void)
{
    a |= BIT3;  
}
void clear_bit3(void)
{
    a &= ~BIT3;    
}

25、访问固定的内存位置:要求设置一绝对地址为0x67a9的整形变量的值为0xaa66

int *ptr;
ptr = (int*)0x67a9;
*ptr = 0xaa66;

26,ISR不能有返回值;ISR不能传递参数;ISR是短而高效的,不能做浮点运算;ISR使用printf也是不明智的,经常有重入和性能上的问题

27、动态内存分配的内存碎片问题:

28、typedef 和#define

29,#define SWAP(a,b) \
a = a+b; \
b = a - b; \
a = a - b;

#define Min(a,b)  ((a)<(b))?(a):(b) 

30、在linux系统中,用户空间的哪个操作不会使系统陷入内核:计算机系统的各种硬件资源有限,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,所有对这些资源的访问都必须由操作系统控制,操作系统是使用这些资源的唯一入口;在linux系统中系统调用是用户空间访问内核的唯一手段,除异常和陷入外

31、以0开头的0~7等八个数字组成的数是八进制数;以0X开头紧跟0~9及a~f或A~F等16个符号组成的数是十六进制;不是以0开头的0~9等10个数字组成的数是十进制数

32,

int main()
{
    char* str = "abcd";
    int length = strlen(str);
    char* dest = (char*)malloc(length+1);
    char* d = dest;
    char* s = &str[len-1];  
    while(len-- != 0)
    {
        d++ = s--;  
    }   
    *d = '\0';
    printf("%s\n",dest);
    free(dest);
    return 0;   
}

猜你喜欢

转载自blog.csdn.net/qq_34121068/article/details/78003785