2022年度C语言面试题库汇编含完整答案_第1页
2022年度C语言面试题库汇编含完整答案_第2页
2022年度C语言面试题库汇编含完整答案_第3页
2022年度C语言面试题库汇编含完整答案_第4页
2022年度C语言面试题库汇编含完整答案_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2022年度C语言面试题库汇编(含完整答案)

1、变量的声明和定义有什么区别?

在C语言中声明变量:变量声明仅在编译时向编译器提供以给定类型和名称存

在的变量的确定性,以便编译器继续进行进一步编译,而不需要该变量的所有

细节。在C语言中,当我们声明一个变量时,我们只将信息提供给编译器,

但没有为它保留内存。它只是一个引用,通过它我们只向编译器保证这个变量

可以定义在函数内部或函数外部。注意:我们可以多次声明一个变量,但只定

义一次。例如:externintdata;externintfoo(int,int);intfun(int,char);/

/

2、全局变量和静态全局变量有什么区别?

全局变量和静态全局变量有不同的联系。这就是全局变量可以在文件外部访问

但静态全局变量只能在声明它的文件内访问的原因。静态全局变量===»>

内部链接。非静态全局变量===»>外部链接。

3、C语言中的存储类是什么?

存储类决定程序中变量或函数的范围(生命周期)和范围(可见性)。每个变量都

在内存中的某个位置以位的形式存储变量的值。存储类决定这些变量值将存储

在CPU寄存器、堆栈内存、BSS或DS中的位置。C语言编程中有四种可

用的存储类,它们如下:autostaticexternregister

4、内部静态变量和外部静态变量的区别是什么?

在C语言中,外部静态变量有内部链接,内部静态变量没有链接。这就是它

们具有不同范围但两者都将在整个程序中存活的原因。外部静态变量===»>

内部链接。内部静态变量===»>无。

5、typedef和宏有什么区别?

让我们先来看一下typedef和宏的简短描述,以了解它们之间的区别。typed

efC语言提供了一个非常重要的关键字typedef,用于为现有类型定义新名称。

typedef是编译器指令,主要与用户定义的数据类型(结构、联合或枚举)一起

使用,以降低它们的复变性并增加代码的可读性和可移植性。语法:typedef

typeNewTypeName;示例:typedefunsignedintUnsignedlnt;现在Unsi

gnedlnt是一个新类型,就可以施用它来创

6、以下C代码的输出是什么?

#include<stdio.h>

intmain()

typedefautointmyAutoInt;

myAutoIntdata=4;

printf("%d",data);

return0;

c

编译器错误。解释:typedef已被视为部分存储类,因此不能一次混合两个存

储类。

7、C语言中的变量是什么?

C语言中的变量定义了一个位置名称,可以在其中放置值,并且可以在程序中

需要时使用这些值。换句话说,可以说变量是一个名称(或标识符),它指示内

存中的某个物理地址,其中数据以字符串位的形式存储。在C语言中,每个

变量都有特定的数据类型(预定义的或用户定义的),这些数据类型决定了变量

的大小和内存布局。注意:每个变量都绑定了两个重要的属性,范围和范围。

8、使用变量p写出下一些声明:

1、一个整数变量。

2、五个整数的数组。

3、指向整数的指针。

4、一个由十个指向整数的指针组成的数组。

5、指向整数的指针。

6、指向三个整数数组的指针。

7、一个指向函数的指针,它将指向字符的指针作为参数并返回一个整数。

8、一个由五个指针组成的数组,指向接受一个整数参数并返回一个整数的函数。

变量p对应的声明如下:1.intp;//Aninteger2.intp[5];//Anarrayof

5integers3.int*p;//Apointertoaninteger4.int*p[10];//Anarray

of10pointerstointegers5.int**p;//Apointertoapointertoaninteg

er6.int(*p)[3];//Apointer

9、C语言有哪些数据类型?

数据类型是数据的分类,它告诉编译器或解释器程序员打算如何使用数据。换

句话说,您可以说它定义了变量的大小(BYTE)和范围。C语言中数据类型的分

类:1、预定义数据类型(int、char、float等)2、用户定义的数据类型(struct、u

nion、enum)在C语言中,不同的数据类型有不同的范围。范围因编译器而

异。在下表中,根据32位GCC编译器列出了一些具有范围和格式说明符

的数据类型。数据类型Memory(bytes)范围

10、关键字static的用途是什么?

在C语言中,static关键字非常重要。如果在变量或函数中使用了static关

键字,那么只有内部链接或无链接有效。1、静态变量只初始化一次,因此在函

数体内声明为静态的变量在函数调用之间保持其先前值。2、带有static关键字

的全局变量具有内部链接,因此只能在翻译单元(.c)内访问。其他翻译单元无

法访问它。static关键字保护变量从另一个编译单元访问。3、默认情况下,

在C语言中,函数的链接是外部的,它可以被同一个或另一个翻译单元访

问。在static关键字的帮助下,可以

11、有哪些不同类型的链接?

C语言有3种链接,外部链接、内部链接和无链接。

12、静态变量可以在头文件中声明吗?

可以,我们可以在头文件中声明静态变量。

13、C语言中整数的大小取决于什么?

C标准解释了整数的最小大小应该是16位。一些编程语言解释说整数的大小

取决于实现,但可移植程序不应该依赖它。整数的大小主要取决于编译器编写

者为底层处理器编写的编译器类型。可以看到编译器根据便利性和底层架构愉

快地改变整数的大小。因此,建议使用C99整数数据类型(uin8_t、uin16_

t、uin32_t..)代替标准into

14、整数是看符号的还是无符号的?

在标准C语言中,整数数据类型默认是有符号的。所以如果创建一个整数变

量,它可以存储正值和负值。

15、C中的无符号整数和有符号整数有什么区别?

有符号和无符号整数类型具有相同的存储(根据标准至少16位)和对齐方式,

但它们仍然存在很多差异,在下面的行中,描述有符号和无符号整数之间的一

些差异。有符号整数可以同时存储正值和负值,但在它旁边无符号整数只能存

储正值。有符号整数类型的非负值范围是相应无符号整数类型的子范围。例

如:假设整数的大小为2个字节。有符号整数-32768到+32767无符号整

数0到65535在计算无符号整数时,它永远不会溢出,因为如果计算结果大

于无符号整数类型的最大值,则它会以比结果类型可以表示的

16、宏和函数有什么区别?

宏和函数的区别如下所示:

17、以下C代码的输出是什么?

#include<stdio.h>

#definePRINT(var,data)do{\

if(van<data八

{\

printf("Aticleworld");\

++var;\

)\

}while(l);

intmain()

PRINT(0,2);

return0;

}

输出:编译器错误。说明:扩展宏时,var将被替换为O(Rvalue)。因为正

在尝试增加Rvalue,所以将收到编译器错误。

18、C语言中的枚举是什么?

C语言中的枚举是用户定义的数据类型。它由一组命名的常量整数组成。使

用enum关键字,我们可以通过使用枚举标签(可选)和命名整数列表来声明枚

举类型。基本上,我们使用枚举来增加代码的可读性,并且与符号常量(宏)相

比,使用枚举更容易调试代码。enum最重要的属性是它遵循范围规则,编译

器会自动将值分配给它的成员常量。注意:枚举类型的变量存储由该类型定义

的枚举列表的值之一。enum的语法如下:enumEnumeration_Tag{Enu

meration_List};E

19、关键字const是什么?

const限定符仅向编译器指示无法更改限定对象的值。简单来说,const表

示不可修改(不能在运行时给对象赋值)。语法:constDataTypeIdentifier=

Value;e.g.constintiData=0;

20、什么时候应该在C程序中使用const?

在程序中有以下地方需要使用const关键字:在引用函数参数调用中,如果

不想更改已传入函数的实际值。intPrintData(constchar*pcMessage);在

某些地方,const比宏更好,因为const由编译器处理并且具有类型检查。

constintciData=100;对于I/O和内存映射寄存器,const与volatile限

定符一起使用以实现高效访问。constvolatileuint32_t*DEVICE_STATUS

21、以下代码声明的含义是什么?

1.constinta;

2.intconsta;

3.constint*a;

4.int*consta;

5.intconst*aconst;

a是一个常数整数。与第一个类似,a是一个常数整数。这里的a是一个指向

常量整数的指针,整数的值是不可修改的,但指针是可修改的。这里的a是一

个指向整数的常量指针,指向的整数的值是可修改的,但指针是不可修改的。

这里的a是一个指向const整数的const指针,这意味着指向的整数和指针

的值都是不可修改的。

22、下面的C程序的输出是什么?

#include<stdio.h>

intmain()

intpos=14;

floatdata=1.2;

printf("%*f"jposjdata);

return0;

上述代码的输出将是1.200000,有6个空格。解释:这里1.200000是用

6个空格打印的,因为通过在printf中给出*可以指定一个额外的宽度参

数,这里pos是宽度,data是值。如果数字小于宽度,则其余部分用空格填

充。

23、常量指针和指向常量的指针有什么区别?

常量指针:常量指针是其值(指向的地址)不可修改的指针。如果尝试修改指针

值,将得到编译器错误。常量指针声明如下:Data_Type*constPointer_N

ame;int*constptr;//constantpointertointeger当或译以下代码会得至U编

译器错误时,让我们看看下面的示例代码。#include<stdio.h>intmain(void)

{intvar1=10,var2=20;//Initia

24、后递增和递减运算符是什么?

当在操作数上使用后自增(++)运算符时,结果是操作数的值,得到结果后,

操作数的值加1o后自减(-)的工作运算符类似于后自增运算符,但不同之

处在于操作数的值减1o注意:递增和递减1是指定的类型。

25、前置增量和后置增量哪个更好?

现在的编译器已经足够聪明了,它们根据需求优化代码。post和pre-increm

ent都有自己的重要性,我们需要根据要求使用它们。如果您通过字符指针逐

字节读取闪存,那么在这里您必须使用后增量,否则将跳过数据的第一个字

节。在预递增的情况下,指向地址将先递增,然后再读取该值。在下面的示例

代码中,创建一个字符数组并使用想要读取数组值的字符指针。但是如果使用

预增量运算符会发生什么?这个问题的答案是“A”将被跳过而B将被打印出

来。#include<stdio.h>intm

26、表达式ptr++和++ptr相同吗?

*ptr++和++*ptr两种表达方式不同。下面通过一个示例代码来了解这两个表

达式之间的区别。#include<stdio.h>intmain(void){intaiData[5]={100,

200,30,40,50};int*ptr=aiData;*ptr++;printf("aiData[O]=%d,aiData[1]

=%d,*piData=%d",aiData[0],

27>表达式*++ptr和++*ptr是否相同?

这两种表达方式不同。下面来看一个示例代码来了解这两个表达式之间的区

别示例1:#include<stdio.h>intmain(void){intaiData[5]={100,200,

30,40,50};int*piData=aiData;++*piData;printf("aiData[O]=%d,aiData

[1]=%d,*piData=%d",aiData[0],aiDat

28、常量和宏有什么区别?

常量和宏的主要区别如下:const关键字由编译器处理,另一方面,宏由预处

理器指令处理。const是修饰标识符行为的限定符,但宏是预处理器指令。使

用const关键字会进行类型检查,但不会对#define进行类型检查。const由

C块限定,#define适用于文件。const可以作为参数(作为指针)传递给函

数。在通过引用调用的情况下,它可以防止修改传递的对象值。

29、C语言中的volatile变量是什么?

volatile关键字是一种类型限定符,可防止编译器优化对象。根据C标准,

具有volatile限定类型的对象可能会以实现未知的方式进行修改或具有其他未

知的副作用。也可以说,可以随时更改volatile限定对象的值,而无需代码执

行任何操作。如果对象由volatile限定符限定,则编译器每次程序访问它时都

会从内存中重新加载该值,这意味着它会阻止将变量缓存到寄存器中。从内存

中读取值是检查值的不可预测变化的唯一方法。

30、可以创建volatile指针吗?

可以,可以在C语言中创建一个volatile指针。示例代码如下:int*volatil

epiData;//piDataisavolatilepointertoaninteger.

31、如何正确使用volatile关键字的位置?

在这里,指出了一些需要使用volatile关键字的重要地方。1、访问内存映射

的外设寄存器或硬件状态寄存器。示例代码:#defineCOM_STATUS_BIT0

X00000006uint32_tconstvolatile*constpStatusReg=(uint32_t*)0x0002

0000;unit32_tGetRecvData(){//Codetorecvdatawhile(((*pStatusReg)

&COM

32、C语言中的const和volatile限定符有什么区别?

const关键字是编译器强制执行的,它表示程序无法更改对象的值,这意味着

它使对象成为不可修改的类型。例如:constinta=0;如果尝试修改a的

值,将收到编译器错误,因为a使用const关键字限定,阻止更改整数变量的

值。另一方面,volatile阻止任何编译器优化,并表示对象的值可以通过超出

程序控制范围的东西进行更改,因此编译器不会对对象做出任何假设。例如:

volatileinta;当编译器看到上述声明时,它会避免对a做出任何假设,并在每

次迭代中从分配给变量的

33、C语言中的变量可以既是常量(const)又是易失(volatile)?

是的,可以同时使用常量和易失性。volatile和const关键字的最大用途之一

是在访问GPIO寄存器时。在GPIO的情况下,如果它被配置为输入,它的

值可以通过“外部因素'(如果开关或任何输出设备连接到GPIO)来更改。在这

种情况下,volatile起着重要作用,并确保编译器始终从GPIO地址读取值

并避免做出任何假设。使用volatile关键字后,无论何时访问端口,都将获得

正确的值,但这里还有一个问题,因为指针不是const类型,因此可能是程序

更改了指针的指

34、如何在C语言中设置、清除、切换和检查单个位?

设置第N位设置第N位意味着如果第N位为0,则将其设置为1,如果为

1,则保持不变。在C中,按位或运算符(|)用于设置整数数据类型的位。

据我们所知|(按位或运算符)计算一个新的整数值,其中每个位的位置只有当操

作数(整数类型)在该位置为1时才为1o简而言之,如果其中任何一位为1,

则可以说两位的“按位或”始终为1。0|0=01|0=10|1=11|1

=1设置位的算法:Number|=(1UL«

35、如何检测两个整数是否有相反的符号(位操作)?

让给定的整数是a和b。如果a的符号位与b的符号位不同,则a和b的符号

位(MSB)的EX-OR将为1。换句话说,如果a和b的符号相反,a和b的

异或将是负数。示例代码:boolCheckOppositeSign(inta,intb){boolb

RetValue=0;bRetValue=((aAb)<0);//trueifaandbhaveopposit

esignsreturnbRetValue;}

36、编写一个高效的C程序来反转数字的位?

有很多方法可以反转数字的位,这里描述了三种通用的方法来反转位。方法一

在此方法中,将检查num的设置位并循环遍历整数的所有位。如果发现nu

m的第i位被设置,那么只需将1放在tmp的((INT_BITS-1)-ith)

位置,其中INT_BITS是整数的位数。#defineCHAR_BITS8//sizeofch

aracter#defineINT_BITS(sizeof(int)*CHAR_BITS)//bitreversa

37、如何在C语言中以二进制格式打印十进制数?

参考以下代码实现:#defineCHAR_BITS8//sizeofcharacter#defineIN

T_BITS(sizeof(int)*CHAR_BITS)//bitsinintegervoidPrintlnBinary(unsi

gnedn){charPos=(INT_BITS-1);for(;Pos>=0;--Pos){(n&(1

«Pos)

38、下面程序的输出是什么?

#include<stdio.h>

intmain()

intdata=16;

data=data>>1;

printf("%d\n",data);

return0;

}

上面程序的输出是:8

39、下面程序的输出是什么?

#include<stdio.h>

intmain()

{

intc=8八7;

printfC^dXn",c);

}

上面程序的输出是:15

40、下面程序的输出是什么?

#include<stdio.h>

#include<stdlib.h>

intmain()

{

void*pvBuffer=NULL;

pvBuffer=malloc(sizeof(int));

*((int*)pvBuffer)=0x00000000;

*((int*)pvBuffer)|=2;

printf("OutPut=%d",*((int*)pvBuffer))j

free(pvBuffer);

return0;

}

上面程序的输出:2

41、编写一个程序交换两个数字(不使用第三个变量)?

假设a、b两个数字,有很多方法不使用第三个变量交换两个数字的值。方

法1(使用算术运算符):#include<stdio.h>intmain(){inta=10,b=5;

//algotoswap'a'and'b'a=a+b;//abecomes15b=a-b;//bb

ecomes10a=a-b;//tonallya

42、写一个程序来检查一个整数是2的寨吗?

下面来看看如现编写一个小算法来检查2的累。如果一个数字是2的募,则

函数返回1。示例代码1:intCheckPowerOftwo(unsignedintx){return

((x!=0)&&(!(x&(x-1))));}示例代码2:intCheckPowerOftwo(unsig

nedintx){return(x&&(!(x&(x-1))));}

43、以下代码的输出是什么?

#include<stdio.h>

intmain()

{

intx=-30;

x=x<<1;

printf("%d\n",x);

}

输出结果:未定义的行为。

44、以下代码的输出是什么?

ttinclude<stdio.h>

intmain()

{

intx=-30;

x=x>>1;

,,,,

printf(%dJx);

return0;

}

实现定义(implementation-defined)

45、编写一个程序来计算整数中的集合位?

请参考下面代码实现:unsignedintNumberSetBits(unsignedintn){unsig

nedintCountSetBits=0;while(n){CountSetBits+=n&1;n»=1;}

returnCountSetBits;}

46、在C程序中应该什么时候使用指针?

在C程序中有下面情节应该使用指针:传递大型结构喜欢的服务器请求或响

应数据包。实现链表和二叉树。GPIO或硬件寄存器。从函数中获取地址或更

新值(通过引用调用)创建动态数组。使用函数指针创建回调函数。注意:除此

之外,还有很多地方需要用到指针。

47、C语言中的void或泛型指针是什么?

void指针是通用指针。它没有关联的数据类型,这就是为什么它可以存储任何

类型对象的地址并类型转换为任何类型的原因。根据C标准,指向void的指

针应具有与指向字符类型的指针相同的表示和对齐要求。void指针声明类似

于普通指针,但不同之处在于使用void关键字代替数据类型。语法:void*

Pointer_Name;

48、C语言市空(或void)指针的优点是什么?

C语言中的void指针有以下优点:使用void指针,可以创建一个可以接受

任何数据类型参数的通用函数。memcpy和memmove库函数是泛型函数的

最佳示例,使用这些函数可以将数据从源复制到目标。例如:void*memcpy

(void*dst,constvoid*src,size_tnum);void指针可以转换为另一*

薮据类型,这就是malloc、calloc或realloc库函数返回void*的原因。

由于void*这些函

49、什么是悬空指针?

通常,当引用对象被删除或释放时,会出现延迟指针,而不会更改指针的值。

它会产生问题,因为指针仍然指向不可用的内存。当用户尝试取消引用悬空指

针时,它会显示未定义的行为,并且可能是分段错误的原因。示例代码:#in

clude<stdio.h>#include<stdlib.h>intmain(){int*piData=NULL;//creatin

gintegerofsize10.piData=malloc(sizeo

50、什么是野指针?

在首次使用之前未正确初始化的指针称为野指针。未初始化的指针行为是完全

未定义的,因为它可能指向某个可能导致程序崩溃的任意位置,这就是它被称

为野指针的原因。换句话说,编程语言中没有被编译器或程序员初始化的每个

指针都以野指针开始。注意:通常,编译器会警告通配指针。语法:int*pi

Data;//piDataiswildpointer

51、C语言中NULL指针是什么?

根据C标准,值为0的整数常量表达式,或转换为void*类型的此类表达

式称为空指针常量。如果将空指针常量转换为指针类型,则生成的指针称为空

指针。语法:int*piData=NULL;//piDataisanullpointer

52、什么是函数指针?

函数指针类似于其他指针,但唯一的区别是它指向函数而不是变量。换句话

说,函数指针是一种存储函数地址的指针,这些指向的函数可以在程序中随时

被函数指针调用。

53、如何在C语言中声明指向函数的指针?

声明函数指针的语法非常简单。一开始似乎很难,但是一旦熟悉了函数指针,

它就会变得容易。函数指针的声明类似于函数的声明。这意味着函数指针还需

要返回类型、声明名称和参数列表。需要记住的一件事是,每当在程序中声明

函数指针时,声明名称前面都有*(星号)符号并用括号括起来。例如:void(

*fpData)(in£);为了更好的理解,我们举个例子来描述一下C语言中函数指

针的声明。示例:void(*pfDisplayMessage)(constchar*);在上面的

54、函数指针可以在哪里使用?

有很多地方可以使用函数指针。通常,函数指针用于实现回调函数、有限状态

机以及提供C语言中的多态特性等。

55、C语言中的数组和指针有什么区别?

数组和指针之间的一个重要区别是数组中元素的地址始终是固定的,不能在执

行时修改地址,但对于指针,可以根据需要更改指针的地址。考虑下面的例

子:在下面的示例中,当尝试增加数组的地址时,将得到编译器错误。

56、下面C语言程序的输出是什么(假设int大小为4个字节)?

#include<stdio.h>

intmain()

int(*arr)[5][4];

//Supposeintegersize4bytes

printf("*arrsize%d",sizeof(*arr));

return0;

}

输出结果为:*arrsize80解释:int(*arr)[5][4]是指向数组的指针。4*5的

元素总数,如果整数大小为4字节,则*arr的大小将为80。

57、什么是静态内存分配和动态内存分配?

根据C标准,有四种存储持续时间,静态、线程(C11)、自动和分配。存储

期限决定了对象的生命周期。静态内存分配:静态分配意味着,一个对象具有

外部或内部链接或使用静态存储类声明。它仅在程序启动之前初始化一次,其

生命周期贯穿程序的整个执行过程。全局和静态变量是静态内存分配的一个示

例。动态内存分配:在C语言中,有很多用于动态分配内存的库函数(mall。

c、calloc或realloc,..)□动态分配内存的问题之一是它不会被编译器未身破

坏,这意味着用户有责任解除分配的内存。当使用内存管

58、C语言中的内存泄漏是什么?

内存泄漏是一个常见且危险的问题。这是一种资源泄漏。在C语言中,当

使用内存管理功能分配一块内存而忘记释放它时,就会发生内存泄漏。示例:

intmain(){char*pBuffer=malloc(sizeof(char)*20);/*Dosomework

*/return0;/*Notfreeingtheallocatedmemory*/}注意:一旦分配了内

存,分配的内存在空闲之前不会分配给另一个程序或进程。..

59、malloc和calloc有什么区别?

malloc和calloc是内存管理函数。它们用于动态分配内存。基本上,calloc

和malloc之间没有实际区别,只是calloc分配的内存用0初始化。在C

语言中,calloc函数将所有分配的空间位初始化为零,但malloc不初始化分

配的内存。这两个函数的参数数量也有所不同,malloc接受一个参数,而c

alloc接受两个。

60、realloc。函数的作用/目的是什么?

realloc()函数用于调整分配的内存块的大小。它有两个参数,第一个是指向先

前分配的内存的指针,第二个是新请求的大小。realloc。函数首先释放旧对

象,然后重新分配新指定的大小。如果新大小小于旧大小,则新分配内存的内

容将与先前相同,但如果新创建的对象中的任何字节超出旧大小,则超出大小

的值将是不确定的。语法:void*realloc(void*ptr,size_tsize);示例代

码:#include<stdio.h>#include<stdli

61、malloc(O)的返回值是多少?

如果请求空间的大小为零,则行为将由实现定义。malloc的返回值可能是一

个空指针,或者它表明该大小的行为是某个非零值。标准建议不要使用指针来

访问当大小为零时由malloc返回的对象。

62、什么是动态内存碎片?

内存管理功能保证如果内存被分配,那么它将适当地与任何具有基本对齐的对

象对齐。基本对齐小于或等于没有对齐规范的实现所支持的最大对齐。动态内

存分配的主要问题之一是碎片,基本上,碎片发生在用户没有有效使用内存

时。有两种类型的碎片,外部碎片和内部碎片。外部碎片是由于空闲列表上可

用但程序无法使用的小空闲内存块(小内存洞)造成的。有不同类型的空闲列表

分配算法可以有效地使用空闲内存块。为了理解外部碎片,考虑一个程序有3

个连续的内存块并且用户释放中间的内存块的场景。在这种情况下,如果所需

的内存块大于单个内存

63、C语言中的fee()函数工作如何?

当我们调用内存管理函数(malloc、calloc或realloc)时,这些函数会保留额外

的字节用于簿记。每当调用free。函数并传递指向已分配内存的指针时,free

()函数都会获取簿记信息并释放分配的内存。无论如何,如果程序更改指向已

分配地址的指针的值,则调用free。函数会给出未定义的结果。Theall

ocatedblock/+--------+---------------------.

64、如何确定分配的内存部分的大小?

在C语言中,可以使用sizeof运算符计算静态数组的大小,但没有运算符来

计算动态分配的内存大小。主要有两种方法可以在代码的每个部分中获取分配

的内存大小。创建一个全局变量来存储分配的内存大小。携带已分配内存的长

度。示例:假设需要创建一个大小为n的整数数组。所以要携带数组的数

组长度,需要为n+1分配内存。int*piArray=malloc(sizeof(int)*(n+1)

);如果内存分配成功,则分配n(数组的大小)它的0个位置。piArray[

65、以下C语言代码的输出是什么?

#include<stdio.h>

#include<stdlib.h>

ttdefineALLOC_MEMORY5

intmain()

{

intloop=0;

int*ptr=malloc(ALLOC_MEMORY*sizeof(int));

if(ptr==NULL)

{

perror(ufailtoallocatememory");

return-1;

}

for(loop=0;loop<ALLOC_MEMORY;++loop)

{

*(ptr+loop)=loop;

}

printf("%d",*ptr++);

printf("%d",(*ptr)++);

printf("%d",*ptr);

printf("%d",*++ptr);

printf("%d",++*ptr);

free(ptr);

return0;

}

c

上面示例代码输出结果是:01223解释:第一个printf:*ptr++意味着它

将增加地址并取消引用该地址,但这里的增量是一个后增量,所以首先和之后

取消引用,所以在基地址上你得到O(ptr指向下一个位置)。第二个printf:(*pt

r)++第一次取消引用,然后增加值,所以位置值是1是增量,所以得到2(这

里的指针没有改变)。第三个printf:*ptr表示当指针指向该位置时取消引

用,所以得到2。第五个printf:*++ptr表示第一个指针在取消引用后递

66、memcpy和memmove有什么区别?

这两个副本函数都用于将n个字符从源对象复制到目标对象,但它们有一些区

另U,如下所述。如果源指针和目标指针指向的内存区域重叠,则memcpy复

制函数会显示未定义的行为。memmove函数在重叠的情况下具有定义的行

为。因此,每当有疑问时,使用memmove代替memcpy会更安全。#incl

ude<string.h>#include<stdio.h>charstr1[50]="IamgoingfromDelhi

to

67、使用C语言在不使用库函数的情况下实现反转字符串。

字符串是字符的集合,它总是以空字符结尾,这意味着每个字符串在字符串的

末尾都包含一个空字符。例子:char*pszData="aticle";在上面的示例中,

pszData是指向字符串的指针。字符串的所有字符都存储在一个连续的内存

中,并在字符串的最后一个空字符组成。见下表:character'a'tT'c'T

‘e'"Address0x000x010x020x03.

68、什么是字节序?

字节序是在内存中存储数据的字节顺序,它还描述了通过数字链路传输字节的

顺序。在内存数据存储中,顺序取决于系统的字节序,如果系统是大字节序,

则首先存储MSB字节(意味着在低地址),如果系统是小端序,则首先存储LS

B字节(在较低的地址)。Httle-endian和big-endian系统的一些示例:

69、编写一个C程序来检查系统的字节顺序?

下面使用C语言来编写程序检查系统的字节顺序。方法一:/include<stdi

o.h>#include<stdlib.h>#include<inttypes.h>intmain(void){uint32_tu3

2RawData;uint8_t*pu8CheckData;u32RawData=0x11223344;//Assign

datapu8CheckData=(uint8_t*)

70、如何在C中将little-endian转换为big-endian(反之亦然)?

下面下面是编写C程序来将little-endian转换由big-endian(反之亦然)。方

法一:#include<stdio.h>#include<stdlib.h>#include<inttypes.h>//Func

tiontochangetheendianessuint32_tChangeEndianness(uint32_tu32Val

ue){uint32_tu32Result=0;u3

71、编写一个C程序来检查一个数是否是素数?

素数是一个正的自然数,它的值大于1,并且只有两个因数1和数本身。使

用除法检查素数的算法开始步骤1->取数n步骤2T将数字n除以(2,

n-1)或(2,n/2)或(2,sqrt(n))。步骤3-如果数n可被(2,n-1)或(2,

n/2)或(2,sqrt(n))之间的任何数整除,则它不是素数步骤4-如果它不能

被(2,n-1)或(2,n/2)或(2,sqrt(n))之间的任何数整除,则它是质数最后

停止示例代码:

72、如何在不使用sizeof运算符的情况下在C中计算出数组的大小?

方法一:#include<stdio.h>intmain(intargc,char*argv[]){intiTotalEle

merit=0;intaiData[={10,20,30,40,50,60};//Calculatenumberso

felementsusingpointerarithmaticiTotalElement=*(&aiData+1)-aiDa

73、.何在不使用sizeof运算符的情况下在C中计算出结构体的大小?

方法一:当增加指针时,指针会增加一块内存(内存块取决于指针数据类型),

所以这里将使用这种技术来计算sizeof结构。首先,创建结构。创建一个指

向结构的指针并分配NULL指针。将指针增加到1。#include<stdio.h>#in

elude<stdlib.h>typedefstruct{charName[12];intAge;floatWeight;int

RollNumber;

74、结构填充是什么?

在结构或联合的情况下,编译器在结构或联合的成员之间插入一些额外的字节

用于对齐,这些额外未使用的字节称为填充字节,这种技术称为填充。填充以

内存为代价提高了处理器的性能。在结构或联合数据成员中,按照最高字节成

员的大小对齐,以防止性能损失。注意:处理器架构要求的数据类型对齐,而

不是语言。

75、在C语言中如何将二维数组作为参数传递?

在C语言中,有很多方法可以将二维数组作为参数传递。在下面的部分中,

将描述几种将二维数组作为参数传递给函数的方法。使用指针将二维数组传递

给c中的函数多维数组的第一个元素是另一个数组,当传递一个二维数组时,

它将被拆分为指向数组的指针。例如如果intaiData[3][3],是一个2D整数

数组,它将被拆分为指向3个整数数组的指针(int(*)[3])oinclude<stdio.

h>//Sizeofthecreatedarray#define

76、枚举和宏有什么区别?

枚举和宏的区别:与宏相比,枚举增加工代码的可读性并且易于调试。枚举的

所有元素组合在一起,宏是不可能的。示例://constantcreatedbymacro,

#defineMON0#defineTUE1#defineWED2#defineTHU3#defineF

RI4#defineSAT5#defineSUN6//constantcreatedbyenum,typedef

enumDays{Mon,Tue,

77、如何删除没有头指针的链表中的节点?

通过给定的指针直接删除节点没有实际的解决方案,需要做一些技巧。通过给

定勺要删除的指针将数据从下一个节点复制到当前节点并删除下一个节点。参

考示例:〃GettheAddressofthenextnodeNodePointertemp=Node

->pNextNode;//GetthedataofnextnodeNode->iData=temp->iData;//

GettheAddressofnexttonextno

78、如何在C语言中定义多行宏?

请参阅下面的示例,其中交换两个变量的值。#include<stdio.h>#definesw

ap(x,y,T)do{Ttemp=(*x);(*x)=(*y);(*y)=temp;}while(0)intmai

n(void){inta=5;intb=9;printf("Valueofaandbbeforeswaping");

79、C语言中的递归是什么?

递归是函数调用自身的过程,直接或间接调用自身的函数称为递归函数。递归

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论