1.new与malloc的区别
-> 申请的内存所在位置不同
new操作符从自由存储区上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。
自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,
该内存即为自由存储区。
-> 是否需要指定内存大小
使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算,
而malloc则需要显式地指出所需内存的尺寸。
-> 对数组的处理
C++提供了new[]与delete[]来专门处理数组类型:A * ptr = new A[10];//分配10个A对象
使用new[]分配的内存必须使用delete[]进行释放:delete [] ptr;
malloc,它并知道你在这块内存上要放的数组还是啥别的东西,所以如果要动态分配
一个数组的内存,还需要我们手动自定数组的大小:int * ptr = (int *) malloc( sizeof(int)10 );
//分配一个10个int元素的数组。
2.malloc,free底层实现
由于malloc在内存中连续sbrk申请内存,而释放内存只能从后往前释放。为了达到可以先释放
前面申请的内存的效果,每申请一段内存都会有12个字节的内存控制块,控制块的第一个四字
节保存前一个申请内存的起始地址,第二个四字节保存当前内存块的标识位,是有效还是无效。
第三个四字节记录当前内存块的大小字节。
当程序要先free掉前面申请的内存快的时候,只是把标识位置为0,并没有真正的释放掉内存块,
当再次需要申请内存且比之前释放的内存块小的时候,就可以利用之前标识位为0的内存块重新
分配内存,而再次分配可能剩下很小的空间永远都使用不上,就变成了碎片一样使内存可用面积
越来越小。
3.在物理内存为1G的计算机中能否malloc(1.2G)?
-> 在支持虚拟内存管理的操作系统上运行
当请求分配的内存小于或等于128kb时,malloc()会调用系统调用brk()把指向堆起始地址的brk
从数据段(.data)结束地址往高地址调整,分配的内存在堆区域。
当请求的内存大于128kb,malloc()会调用mmap()分配一块内存,mmap是在进程的虚拟地址
空间中(一般是堆和栈中间)找一块空闲的区域。
-> 在不支持虚拟内存管理的实时操作系统上运行
这种情况下,在只有1G物理内存的计算机上malloc(1.2G)就会失败。
4.extern “C”的作用详解
C++ - C与C++相互调用 extern “C“_c++ 转extern"c"公开-CSDN博客
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,
会指示编译器这部分代码按C语言(而不是C++)的方式进行编译。由于C++支持函数重载,
因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数
名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一
5.C语言extern关键字用法和理解
-> 一个c文件需要调用另一个c文件里的变量或者函数,而不能从.h文件中调用变量。
-> Extern int a=5 与 int a = 5意义是一样的。都是定义。而extern int a是声明。
-> 应用函数,跟引用变量是一样的,如果需要调用其它.c文件中的函数,在文件中的函数
6.char 与 int之间的转换
-> 从长字节数据类型转换为短字节数据类型,会产生截断:
如从4字节的int类型转换成1个字节的char类型,则取int数据的最低的一个字节,将这个字节
的数据赋给char型数据,且是有符号的,即首位为符号位;而如果是从int转换成unsigned char
类型,则整个一个字节都是数据,没有符号位。
-> 从短字节类型转换为长字节类型:
从char转换为int:则在前面的三个字节补符号位,即补上0xffffff(char的首位为1),
或0x000000(char的首位为0)。
从unsigned char转换为int,则前面补上0x000000
7.C语言是强类型的语言,这是什么意思?
任何程序都要处理数据,计算机可以处理的数据有多种类型。在C语言程序中,用来保存数据
的变量必须事先定义才能在程序中使用。定义变量的语法如下:变量类型名变量名表;
例如,以下语句定义了x、y、z三个变量名,其值只能取整型值:int x,y,z;在C程序中,每一个
变量都必须声明其取值类型。
因此,C语言是一种强类型的程序设计语言。对于程序中使用到的常量、变量的类型要事先进
行定义才能使用,这是保证程序可靠性的手段之一。
早期的一些计算机程序设计语言不要求对变量的类型进行定义,因此,一个变量的类型在程序
运行期间是不确定的,这将会降低程序的可靠性。
8.没有初始化的变量的初始值是什么?
如果该变量是静态存储类型的变量,系统编译时会自动地赋初值0(对数值型变量)、空字符
(对字符变量)、或者空指针(对指针型变量);
而如果变量是动态存储类型,则在没有赋初值的情况下,将会有一个不确定的值充当其初值,
这是非常危险的,尤其是对于一个不确定的指针来说,修改它所指向存储单元的值可能会造成
巨大危害。
C语言为内存分配空间(代码段、数据段、bss段、存储类、变量的生命周期)_c语言定义.bss空间变量-CSDN博客
9.预处理器的工作原理
#define指令定义了一个宏——用来代表其他东西的一个名字。
#include指令告诉预处理器打开一个特定的文件。
条件编译:#if、#ifdef、#ifndef、#elif、#else和#endif指令可以根据预处理器可以测试的
条件来确定是将一段文本块包含到程序中还是将其排除在程序之外。
编译程序时,只要遇到 #error 就会跳出一个编译错误,既然是编译错误,要它干嘛呢?
其目的就是保证程序是按照你所设想的那样进行编译的。其实就是在编译的时候输出编译
错误信息。
10.嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环
这个问题用几个解决方案。我首选的方案是:
while(1)
{
;}
一些程序员更喜欢如下方案:
for(;;)
{
;}
第三个方案是用 goto:
Loop:
...
goto Loop;
应试者如给出上面的方案,这说明或者他是一个汇编语言程序员。