C语言常见面试题

C语言

static:

1.存放全局区, .bss区(未初始化的全局变量和静态变量)和.data(初始化的全局变量和静态变量)

2.初始值默认为0,只初始化一次

3.限制作用域:修饰全局变量将变量限制在本文件中使用,修饰局部变量将变量限制在本函数中使用 

4.延长生命周期:修饰局部变量时,变量的生命周期为整个程序

结构体和共用体区别

二者都是构造数据类型

结构体:结构体中每一个成员都有自己的内存空间,计算结构体大小指的是所有成员的总字节大小,要注意内部字节对齐;首地址对齐(按最大)、总大小对齐(按最大)、成员对齐(按成员类型)

共用体又叫联合体,每一个成员都共享内存空间。因此,共用体大小等于成员中占内存最大的那个大小。

堆和栈的区别

1)管理方式不同。

栈编译器自动管理,无需程序员手工控制;而堆空间的申请释放工作由程序员控制,通过malloc/free申请释放空间,容易产生内存泄漏。

2)空间大小不同。

栈是向低地址扩展的数据结构,是一块连续的内存区域。

堆是向高地址扩展的数据结构,是不连续的内存区域。

3)是否产生碎片。

对于堆来讲,频繁的malloc/free(new/delete)势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低(虽然程序在退出后操作系统会对内存进行回收管理)。对于栈来讲,则不会存在这个问题。

4)增长方向不同。

堆的增长方向是向上的,即向着内存地址增加的方向;栈的增长方向是向下的,即向着内存地址减小的方向。

什么是段错误?怎么解决段错误?

段错误是指访问的内存超出了系统给的这个程序设定的内存空间,也就是访问非法内存

段错误分类:

l  内存越界(数组越界,变量类型不一致),遍历指针超过本身节点

l  对非法空间进行赋值,指向了不存在的地方(非法的内存访问)

l  给野指针赋值

l  写入只读的内存,访问受系统保护的内存地址 

    解决方法:

(1)定位位置,通过printf进行打印测试,在程序内部的关键部位输出(printf)信息,可以追踪段错误在代码中的可能位置。

(2)gdb调试:在运行到段错误的地方,会自动停下来并显示出错的行和行号。

什么是内存泄漏?什么是野指针?

内存泄漏:当指针指向开辟的堆区空间后,又对指针重新赋值,则没有指针指向开辟空间首地址,这就会导致内存泄漏

野指针:没有规定指向的指针

产生原因:

指针变量没有初始化

指针p被free了没有置为NULL

解决办法:int * p = NULL;

指针和数组的区别

指针就是地址,指针变量就是存放地址的变量;指针可以使用简单的运算符操作;指针加一,代表指向下一个元素;指针大小只和地址有关;对于32位系统,指针占4字节,64位操作系统,指针就是8字节

数组是具有一定顺序关系的变量的集合,变量的数据类型相同,且内存连续。数组名表示数组的首地址,是地址常量,不能被赋值不可以进行自加等操作了;

大小端解决方法

定义联合体,一个成员是多字节,一个是单字节,给多字节的成员赋一个最低一个字节不为0,其他字节为0 的值,再用第二个成员来判断,如果第二个字节不为0,就是小端,若为0,就是大端。

gcc编译步骤

预处理:以#开头的代码,#include、#define,不会检查代码的语法错误

gcc -E  test.c -o test.i

编译:检查语法错误,将程序编译生成汇编文件

gcc -S test.i -o test.s

汇编:将汇编文件生成不可执行二进制文件

gcc -c test.s -o test.o

链接:将不可执行的二进制文件生成可执行二进制文件

gcc test.o  -o test

typedef和define的区别

>>类型不同

typedef是关键字,常用来定义一个标识符或关键字的别名

define是宏定义,c预处理指令

>>处理阶段不同

typedef编译阶段处理,并且具有类型检查功能

define在预处理阶段进行简单替换,不会进行类型检查

>>作用域不同

typedef有自己的作用域

define没有作用域限制,只要之前定义过这个宏,在以后的程序中都可以使用

#ifndef,#endif以及#define的作用

#ifndef是一个条件编译预处理指令,用于判断指定标识符是否已经被定义过(防止头文件重复包含)。它的作用是在编译过程中根据条件决定是否编译某段代码。

#define:宏定义,是在预处理阶段进行展开,不会检查代码错误;在代码中使用的时候注意是单纯的替换

#endif:用于结束条件编译的代码块,作用是标记条件编译的结束位置,以便预处理器知道从此处开始恢复正常的编译

sizeof和strlen区别

1.sizeof是关键字;strlen是函数

2.sizeof是用来计算数据所占空间大小;strlen用来计算字符串的实际长度

3.sizeof是包括\0的;strlen不包括\0。当省略字符数组长度时,sizeof比strlen大1。

结构体和共用体区别

二者都是构造数据类型

1)结构体:让C语言实现面向对象的思想。结构体使用的时候,结构体中每一个成员都有自己的内存空间,计算结构体大小指的是所有成员的总字节大小,要注意内部字节对齐;首地址对齐(按最大)、总大小对齐(按最大)、成员对齐(按成员类型)

2)共用体又叫联合体,每一个成员都共享内存空间。因此,共用体大小等于成员中占内存最大的那个大小。

什么是函数指针?具体用法?

本质是指针,指向函数的指针

用法:一般用做函数的参数,实现代码复用,也可以作为结构体成员,指向某个函数,在pthread_create线程和signal函数中都用过函数指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值