C语言面试题:sizeof在字符串处理中的使用探讨
创始人
2024-12-24 21:12:55
0 次浏览
0 评论
java经典面试题
(4)下面代码中使用两个sizeof有没有问题?[Cyi]voidUpperCase(charstr[])//将str中的小写字母转换为大写{for(size_ti=0;i函数外部的str是一个静态定义的数组,所以它的大小是6,因为函数内部有一个'\0'。
函数内部的Str实际上只是一个指向字符串的指针,没有任何与数组相关的附加信息,这就是使用sizeof的原因。
,它仅被视为指针。
指针的大小为4个字节,因此返回4。
(5)32位机器的指针有多少位?答案:指针由多少位数字组成?只需查看地址总线上的位数即可。
80386之后的所有机器都使用32条数据总线。
因此,指针中的位数为4个字节。
6.main(){inta[5]={1,2,3,4,5};int*ptr=(int*)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}答案:2.5*(a+1)等于a[1],*(ptr-1)等于a[4],执行结果为2,5&a+1-这不是第一个地址+1。
系统会认为向数组a添加偏移量是按数组大小(在本例中为5个整数)的偏移量int*ptr=(int*)(&a+1);那么ptr实际上等于&(a[5]),即a+5。
原因是这样的:&a是一个数组指针,它的类型是i。
nt(*)[5];指针加1时,必须根据指针的类型加上具体的值。
不同类型的指针+1后的大小不同——这是一个长度为5的int数组指针,所以5*sizeof(int)所以ptr实际上是a[5],但是prt是与(&a+1)不同的类型(这非常重要)所以prt-1只减去sizeof(int*)a。
地址相同,但含义不同。
a是数组首地址,也就是a[0]的地址,&a就是地址。
对象(数组)的首地址。
,a+1是数组下一个元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]。
].7.以下代码有什么问题:intmain(){chara;char*str=&a;strcpy(str,"hello");printf(str);return0;}答案:对于str没有分配内存空间,会发生异常。
目标是将字符串复制到字符变量指针指示的地址。
虽然结果可能会正确输出,但由于内部读/写越界,程序崩溃了。
8.char*s="AAA";printf("%s",s);s[0]='B';printf("%s",s);发生了什么?答案:“AAA”是一个字符串常量。
s是一个指向这个字符串常量的指针,所以声明s的时候有问题。
cosntchar*s=“AAA”;并且由于它是一个常量,因此不允许赋值操作s[0]。
9.编写一个“标准”宏,它接受两个参数并返回较小的一个。
答案:.#defineMin(X,Y)((X)>(Y)?(Y):(X))//末尾没有“;”10.嵌入式系统中经常使用无限循环。
如何用C语言编写无限循环?答案:while(1){}或for(;;)11.static关键字的作用是什么?答案:定义静态变量12。
const关键字是什么意思?答:变量代表一个不能改变的常量。
13.关键字mutable是什么意思?并举出三个不同的例子?答:编译器提示。
对象的值可以在编译器没有注意到的情况下发生变化。
14.什么是int(*s[10])(int)?答案:int(*s[10])(int)一个函数指针数组,每个指针都指向一个函数intfunc(intparam)。
15.存在以下表达式:inta=248;b=4;intconstc=21;constint*d=&a;int*conste=&b;intconst*fconst=&a;编译器将不允许使用以下哪个表达式?为什么?答案:*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;*c这是什么东西?*d表示这是一个常量,禁止e=&a这是一个常量,禁止const*fconst=&a;禁止16在不使用第三个变量的情况下交换两个变量的值。
即a=3,b=5,交换后a=5,b=3。
答:有两种解法:一种是用算术算法,另一种是用^(异或)a=a+b;b=a-b;;a=a-b;ora=a^b;//只能是int,char..b=a^b;a=a^b;ora^=b^=a;17.C和C++中的结构有何不同??答:C和C++中的结构体之间的主要区别在于C中的结构体不能包含成员函数,但C++中的结构体可以。
C++中的结构体和类之间的主要区别在于结构体的默认权限不同。
p=(char*)malloc(100);strcpy(p,"helloworld");}intmain(){char*str=NULL;getmemory(str);printf("%s/n",str);free(str);return0;}答案:程序崩溃,getmemory中的malloc无法返回动态内存,free()对str的操作非常危险19.strcpy(szstr,“0123456789”);为什么?答:长度不同会导致OS20的非法使用。
列出几种进程同步机制并比较它们的优缺点。
答案:原子操作的信号量机制自旋锁管进程、会合、分布式系统21.进程间通信的方法答案:共享存储系统消息传递系统管道:基于文件系统22.进程死锁的原因答案:资源竞争和进程开发无效序列23.四个必要死锁条件的答案:互斥、请求保留、不合格和循环。
24、死锁处理答案:鸵鸟策略、回避策略、回避策略、死锁检测与处理。
25.操作系统什么是进程中调度策略?答:FCFS(先到先得)、优先级、时隙轮换、多级反馈。
26.静态类成员和非静态类成员有什么区别?答:每个类只有一个静态成员,每个对象只有一个非静态成员。
27.如何义纯虚函数?使用时应该注意什么?答:virtualvoidf()=0;它是一个接口,子类必须实现它28.数组和链表的区别答:数组:数据顺序存储,固定大小链表:数据可以随机存储,大小可以变化。
动态变化29.七ISO什么是层模型?TCP/UDP属于哪一层?TCP/UDP有哪些优点和缺点?答:应用表示层、会话层、传输层、网络层、物理链路层、物理层TCP/UDP属于传输层。
TCP服务提供数据流、可靠性、高效的流量控制、全双工操作、复用技术等。
与TCP不同,UDP不为IP协议提供强大的流量控制机制和错误恢复功能。
由于UDP相对简单,因此UDP标头包含的字节非常少,并且消耗的有效负载比TCP少。
tcp:提供稳定的传输和流量控制。
缺点是包头较大,冗余性较差。
udp:不提供稳定的服务,包头小,开销低。
30:(void*)ptr和(*(void**))ptr的结果相同吗?其中ptr为同一个指针响应:.(void*)ptr和(*(void**))ptr的值相同31:intmain(){intx=3;printf("%d",x);return1}问题。
既然该函数不会被其他函数调用,为什么它会返回1呢?答:在mian中,c标准认为0表示成功,非零值表示错误。
一个特定的值代一个特定的错误消息32.要给绝对地址0x100000赋值,我们可以使用(unsignedint*)0x100000=1234。
那么如果我们想让程序跳转到绝对地址0x100000该怎么办;做?答案:*((void(*)())0x100000)();首先将0x100000转换为函数指针,即:(void(*)())0x100000然后调用它:*((void(*)())0x100000)();使用typedef可以更直观地看到这一点:typedefvoid(*);)()voidFuncPtr;*((voidFuncPtr)0x100000)();33、给定一个数组表,使用宏定义查找数据元素的数量。
答案:#defineNTBL#defineNTBL(sizeof(table)/sizeof(table[0]))34。
线程和进程有什么区别和关系?线程是否具有相同的堆栈?dll有独立的堆栈吗?答:进程是死的,只是程序执行时终止了一组资源。
操作系统为您创建主线程。
每个线程都有自己的堆栈。
很难回答DLL是否有独立堆栈的问题,或者问题本身是否有问题。
由于DLL中的代码是由特定线程执行的,因此只有该线程才有堆栈。
如果DLL中的代码被EXE中的线程调用,这是否意味着DLL没有自己的独立堆栈?如果DLL中的代码由DLL本身创建的线程执行,这是否意味着DLL具有独立栈?上面是关于栈的。
对于堆来说,每个DLL都是不同的,所以如果内存是从DLL中动态分配的,最好将其从DLL中移除。
如果从DLL分配内存,然后从EXE或另一个DLL中删除它,可能会导致程序崩溃。
35.unsignedshortA=10;printf("~A=%u\n",~A);charc=128;printf("c=%d\n",c);提现需要多少钱?并分析过程响应:第一个问题,~A=0xfffffff5,int值为-11,但输出为uint。
所以第二题打印4294967285,c=0x10,结果会是int,最高位是1,是负数,所以它的值是0x00的补码,也就是128,所以打印-128。
这两个问题都考察了将二进制转换为int或uint时最高有效位的处理。
(2)1.-1,2,7,28126。
28到126之间有什么数字?为什么?答案:第一题的答案应该是:4^3-1=63。
规则:n^3-1(当n为偶数0、2、4时)n^3+1(当n为奇数时)。
数字1,3,5)2.用两个栈来实现队列功能?求算法和思路!答案:首先让A、B两个栈为空。
入队:将一个新元素从队列中压入栈A:(1)判断栈B是否为空;(2)如果不为空,则Pop;从栈A中取出所有元素并依次放入栈B中;(3)弹出栈B的栈顶元素;与上述方法相比,以这种方式实现的入队和出队的摊余复杂度仍然是O(1)。
3.atol()是C库函数中将字符转换为整数的函数吗?这个函数的原型是什么?答案:函数名称:atol功能:将字符串转换为长整型用法:longatol(constchar*nptr)示例程序:#include
答:C使用宏定义,C++使用inline5。
直接连接两个信令点的一组通道的名称是什么?答案:点对点PPP连接7.软件测试有哪些类型?答:黑匣子:测试系统能。
白盒:测试函数的功能、各个功能接口8.在软件设计的哪个阶段确定模块功能和模块接口答案:草图阶段9.enumstring{x1,x2,x3=10,x4,x5,}x;问x;答案:含义等于0.1.10.11.12中的10。
unsignedchar*p1;unsignedlong*p2;p1=(unsignedchar*)0x801000;p2=(unsignedlong*)0x810000;抱歉,p1+5=;p2+5=;答案:801005;810014。
不要忘记这是一个十六进制数。
p2加20得到十六进制数14。
选择题:1.以下哪种协议用于将以太网连接到互联网A.HDLC;.ARP;C.UDP;E.ID2。
网络层协议:A.TCP;C.ICMP;Windows消息调度机制:A.命令队列;.指令栈C.消息队列D.消息栈答案:b、a、c4.找错题:1.下面的程序有什么错误?,j,k;for(k=0;k<=1000;k++)for(j=0;j<250 j++)for(i=0;i i++)a[i][j][k]=0;答案:改变循环语句2的内部和外部部分。>下面是一个求数字平方的程序。
找出错误:#defineSQUARE(a)((a)*(a))inta=5;intb;b=SQUARE(a++);答案:否;问题是s(a++),它等于((a++)×(a++))。
唯一需要注意的是计算后a=7。
3.typedefunsignedcharBYTEintexamply_fun(BYTEgt_len;BYTE*gt_code){BYTE*gt_buf;gt_buf=(BYTE*)MALLOC(Max_GT_Length);......if(gt_len>Max_GT_Length){returnGT_Length_ERROR;}.....}答案:释放记忆问答:1.IPPhone的原理是什么答:建立IPV62.TCP/IP连接的过程是什么?端口有影响吗?答案:三路确认判断哪个应用程序正在使用该协议(3)1.局部变量可以与全局变量同名吗?答:是的,局部情况会阻碍全局情况。
要使用全局变量,您需要使用“::”。
局部变量可以与全局变量同名。
当函数内引用此变量时,将使用同名的局部变量。
全局变量。
对于某些编译器,可以在一个函数中定义多个同名的局部变量。
例如,在两个循环体中定义了同名的局部变量,则该局部变量的作用域为在这个循环2的体内。
如何引用已经定义的全局变量?答:extern可以用来引用头文件,也可以使用extern关键字。
如果使用头文件引用头文件中声明的全局变量,如果该变量拼写错误,则编译过程中会出现错误。
过程中进行了举报。
如果使用extern链接,假设你犯了同样的错误,编译时不会报错,但链接时会报错。
3.是否可以在可定义文件中定义全局变量。
包含在头文件中的多个.C文件中?为什么?答:是的,可以在不同的C文件中以静态形式声明同名的全局变量。
可以在不同的C文件中声明同名的全局变量,前提是只有一个C文件可以为该变量赋初始值。
这样的话,连接就不会断开4、for语句有么问题。
(;1;)?这是什么意思?答案:与while(1)相同。
5.do...while和while...do有什么区别?答:重复上一次循环再进行判断,最后一次判断后再重复循环。
6、编写以下代码的输出内容#include
全局变量本身就是静态存储方法,静态全局变量当然也是静态存储方法。
它们的存储方式没有区别。
它们的区别在于非静态全局变量的作用域是整个原来的程序。
如果源程序由多个源文件组成,则每个源文件中允许使用非静态全局变量。
静态全局变量限制了它们的作用域,即它们只在定义该变量的源文件内有效,不能在同一源程序的其他源文件中使用。
由于静态全局变量的作用范围仅限于一个源文件,并且只能被该源文件中的函数使用,因此可以避免在其他源文件中出现错误。
从上面的分析我们看到,将局部变量改为静态变量改变了它的存储方式,即改变了它的生存期。
将全局变量更改为静态变量会更改其范围并限制其使用。
静态函数的作用域与常规函数不同。
仅在本文档中。
仅在当前源文件中使用的函数必须声明为内部函数(静态),并且内部函数必须在当前源文件中声明和定义。
对于可以在当前源文件之外使用的函数,必须在头文件中指定。
使用这些函数的源文件必须包含此头文件。
静态全局变量和常规全局变量有什么区别:静态全局变量。
仅初始化一次,不允许在其他文件单元中引用它们。
静态局部变量和常规局部变量有什么区别?其他:静态局部变量仅初始化一次,下一次基于上一次结果的值。
静态函数和常规函数有什么区别:静态函数在内存中只有一份,而常规函数每次都会保存一份;2、程序局部变量存在于()中,全局变量存在于()中,动态应用数据存在于()中。
答案:堆栈;静区域;堆3.有以下说明和定义:typedefunion{longi;intk[5];charc;}DATE;structdata{intcat;DATEcow;doubledog;}too;DATEmax;"%执行结果d",sizeof(too)+sizeof(max)):______答案:DATE是un。
ion,公共变量空间。
里面最大的变量类型是int[5],占用20个字节。
所以它的大小是20。
数据是一个结构体,每个变量单独占用空间。
顺序是int4+DATE20+do。
uble8=32。
因此,结果是20+32=52。
当然...在一些16位编辑器中,一个int可以是2个字节,那么结果将是int2+DATE10+double8=204。
队列有什么区别。
并折叠?答:队列先进先出,栈后进先÷5。
这道题是错的,这里就不写了。
6.给定一个单向链表的头,编写一种删除其中一个节点的算法。
您必须首先找到该节点,然后将其删除。
回复:slnodetype*Delete(slnodetype*Head,intkey){}inif(Head->number==key){Head=Pointer->next;free(Pointer);break;}Back=Pointer;Pointer=Pointer->next;if(Pointer->number==key){返回->next=Pointer->next;free(Pointer);break;}voiddelete(Node*p){if(Head=Node)while(p)}7、查找以下代码中的所有错误描述:下面的代码将一个字符串反转,例如“abcd”反转后变成“dcba”。
。
"1.#include"string.h"2.main()3.{4.char*src="helloworld";5.char*dest=NULL;6.intlen=strlen(src);7.dest=(char*)malloc(len);9.=src[len];10.while(len--!=0)11.d++=s--;12.printf("%s",dest);13.return0;14.}答:还要加上#include
(错误int(*ptr)();定义了一个指向函数的指针变量)3.指针在任何情况下都可以执行>、<、>=、<=、==操作。
(错误)4.switch(c)语句中的c可以是int、long、char、float或unsignedint类型。
(错误,不能用真实形式)二、填空(共30分)1、在Windows下,写出当前结果,每空2分,共10分。
charstr[]=“你好”;char*p=str;intn=10;sizeof(str)=()sizeof(p)=()sizeof(n)=()voidfunc(charstr[100]){}sizeof(str)=()答案:6,4,4,4。
详细的解释可以参见我的章节“C/C++程序员应用问题分析”一节。
"2.voidgetmemory(char**p,intnum){*p=(char*)malloc(num);}voidtest(void){char*str=NULL;getmemory(&str,100);strcpy(str,"你好");printf(str);}运行测试函数的结果是什么?()回答满分10分:打印hello,但存在内存泄漏。
3.让intarr[]={6,7,8,9,10};int*ptr=arr;*(ptr++)+=123;printf("%d,%d",*ptr,*(++ptr));()10分答案:8.8这个问题不是特别重要,因为不同编译器中printf参数的方向是不同的,这里*(++ptr)后面跟着*。
点,所以结果是8.83.编程题(第一题20分,第二题30分)1.不使用库函数,在tstrcmp(char*source,char*dest)中写一个函数,等于则返回0,不等于则返回1相等,答案:1.intstrcmp(char*source,char*dest){assert((source!=NULL)&&(dest!=NULL));inti,j;for(i=0;source[i]==dest[i];i++){if(source[i]=='\0'&&dest[i]=='\0')return0;elsereturn-1;}}答案:2.intstrcmp(char*source,char*dest){while((*source!='\0')&&(*source==*dest)){source++;dest++;}return((*source)-(*dest))?-1:0;}2.写入intfun(char*p)函数判断字符串是否为回文。
如果它返回1而不是0,则失败时将返回-1。
。
intfun(char*p){if(p==NULL)return-1;else{intlength=0;inti=0;intjudge=1;length=strlen(p);for(i=0;i
()一个。
以太网;B.快速以太网;C.标记环。
3.以下LAN使用CSMA/CD()协议A.令牌环B.FDDIC.ETHERNETD4。
TCP和UDP协议的相似之处:()A.面向连接的协议B.非面向连接的协议。
。
传输层协议D.以上都不是5.PING应用程序发送___消息()A.TCP请求消息。
B.TCP响应消息。
C.ICMP请求消息。
D.ICMP响应消息。
6.下列说法错误的是()A.中继器是在物理层运行的设备。
B.以太网集线器和交换机在数据链路层运行。
C.路由器是在网络层运行的设备。
D.网桥可以隔离网络层广播。
当桥接收时。
当数据包的目的MAC地址在网桥映射表中没有相应的条目时,将应用以下策略()A.丢弃数据包B.移动数据包组碎片C.将组广播到其他端口D.无以上答案正确8.LANSwitch在网络层模型中的位置()A.物理层B.数据链路层C.网络层D.以上都不是9.小于端口号TCP/UDP___保留用于与现有服务一对一对应。
超过个数字的端口号可以自由分配。
()A.199B.100C.1024D.204810。
当主机从一个网络移动到另一个网络时,以下陈述成立:()A.其IP地址和MAC地址必须更改。
B.必须更改其IP地址。
。
IP地址,但MAC地址不需要更改。
C.需要更改其MAC地址,但无需更改其IP地址。
D.MAC地址和IP地址都不需要更改。
答案:1.B;2.B;;3.C;4.C;5.C;6.BD;7.C;8.B;9.C;10.B。
华为笔试题(4)2006-09-3013:001。
voidtest1(){charstring[10];char*str1="0123456789";strcpy(string,str1);}答:表面上或编译过程中不会有错误。
但如果字符串数组的最初目的是表示一个字符串,那么这个赋值就达不到它的目的了。
最好定义为charstring[11],这样最后一个元素可以存储行尾字符'\0';voidtest2(){charstring[10],str1[10];for(intI=0;I<10 I++){str1[I]='a'>以便访问更远的地方。
你也可以指定str1[9]='\0',也可以。
voidtest3(char*str1){charstring[10];if(strlen(str1)<=10){strcpy(string,str1);}}答:这是重新改题时的第一个错误。
使用strlen(str1)计算的值不包括尾随“\0”字符。
如果该字符串恰好包含10个字符+1个尾随字符,该字符串将不会接收尾随字符。
您可以将strlen(str1)<=10更改为strlen(str1)<10>2、找到错误#defineMAX_SRM256DSNget_SRM_no(){staticintSRM_no;intI;for(I=0;I
2.通过静态声明,使得函数可重入(即结果不可预测),因为变量SRM_no被放置在程序的全局存储区中,每次调用时都可以保留原来的赋值。
这里应该删除静态运算符。
求java工程师面试题?
1.自我介绍——简单介绍一下你的大学、专业、专长和志向2.你了解我们公司的工作吗?感兴趣的?——了解你想做的工作,并用事实证明你的兴趣3.你经常上Java论坛吗?你更喜欢哪一位呢?——还是讲一下CSDN和ITEYE比较好。别人会知道你知识渊博。
4、可以考研吗?对于加班找工作你怎么看?——看你能不能留在公司,你应该说你不会考研,集中精力在公司里努力工作,如果你说“人总是会去更高的地方”,对别人来说会怀疑你工作一年后会换工作。
5.剩下的都是我总结的面试常见问题。
您可以在这里继续提问以获得答案。
1.编写您最常用的5个类和5个接口。
2.写出你知道的排序算法。
并用Java实现快速排序。
3.申请4个线程,其中2个每次增加1,另外2个每次减少1。
4.写下您最常遇到的5种异常情况,并简要描述它们发生的情况。
5.使用单例模式实现线程池。
6.如何存储长度大于2的64次方的整数。
7、编写一段代码当用户输入a时,屏幕上显示b,c写入D:\test.txt。
8.Swing组件使用什么类型的进程栏?9.哪个内置JSP对象可以代表客户端请求?10.什么是同步?实现线程同步的关键字有哪些?如果出现死锁,如何解决?
相关文章
SQLServer数据批量导入:多种方法...
2024-12-19 18:26:10解析JS字符串处理技巧:双逗号替换与符号...
2024-12-15 12:36:42SQL联合查询:高效提取数据,优化两表交...
2024-12-15 17:33:00C语言编程:字符转换与倒序输出技巧
2024-12-14 21:58:37Python第三方库安装指南:两种方法助...
2024-12-18 09:24:44Java字符串转字符串数组:高效循环实现...
2024-12-15 14:26:26Python Format函数详解:字符...
2024-12-15 22:47:13高效清除字符串中的数字字符,实现字符筛选...
2024-12-18 04:03:55C/C++字符串中数字提取与整数数组存储...
2024-12-21 11:47:40揭秘Java与Java大数据:关键差异与...
2024-12-15 18:43:59最新文章
25
2024-12
25
2024-12
25
2024-12
25
2024-12
25
2024-12
25
2024-12
25
2024-12
25
2024-12
25
2024-12
25
2024-12
热门文章
1
Python排列组合与循环运用技巧解析
怎样使用Python进行排列组合?对于这类问题,我们可以使用分割循环来执行转换和...
2
C语言实现字符串倒序输出教程
请教C语言字符串倒序输出#include#includevoidmain(){c...
3
Python字符串比较原理:基于ASCI...
Python基础:如何比较两个字符串对象在Python中,字符串大小比较是基于字...
4
Java工具类:使用Apache POI...
java实现读取word文件、读取表格1、导入对应的依赖包org.apache....
5
C语言字符串转整数:两种实现方法详解
怎么把字符串转换成整数?将字符串转换为整数有两种方法:1.使用C语言自带的库函数...
6
Python列表格式化输出技巧:f-st...
python中请问怎么格式化输出列表在Python中,您可以使用字符串格式化函数...
7
探索非传统方法:JAVA实现100-99...
JAVA,输出100到999的素数,,代码如下,但这不是传统的查找素数的方法。公...
8
C语言实现字符串大小写转换:字符类型判断...
C语言把一个字符串里所有的大写字母换成小写字母,小写字母换成大写字母.其他字符保...
9
Python字符串格式化:深入理解for...
Python小知识:用format格式化输出字符串Python使用format格...
10
C++与C语言:质数判断方法比较及代码示...
C++判断一个数是否为质数方法一:用m除以2到m-1之间的每个整数如果它不可整除...