c语言常见面试题.docx

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1. 请问以下代码有什么问题: int main() { char a; char *str=a; strcpy(str,”hello”); printf(str); return 0; } 答案:没有为str分配内存空间,将会发生异常。问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。 2,请问以下代码有什么问题? #includestdio.h #includestdlib.h #includestring.h void getmemory(char *p) { p=(char *) malloc(100); strcpy(p,hello world); } int main( ) { char *str=NULL; getmemory(str); printf(%s\n,str); free(str); return 0; } 分析:str是一个字符指针,这个指针指向NULL,函数getmemory(char *)这个函数调用时,系统会给他申请一个临时指针变量,函数调用结束又不会释放这个指针变量,所以把malloc申请的内存空间赋给这个指针是不会成功的,因为函数调用结束就会释放掉p,p指针存储的地址也就无从知道。 当把str = NULL赋值给形参变量没意义,p又接受了malloc申请的地址。 3,(第一次遇到这样的题目) 要对绝对地址0×100000赋值,我们可以用(unsigned int*)0×100000 = 1234; 那么要是想让程序跳转到绝对地址是0×100000去执行,应该怎么做? 答案:*((void (*)( ))0×100000 ) ( ); 首先要将0×100000强制转换成函数指针,即: (void (*)())0×100000 然后再调用它: *((void (*)())0×100000)(); 用typedef可以看得更直观些: typedef void(*)() voidFuncPtr; *((voidFuncPtr)0×100000)(); 4,分析下面这个程序 (下面的程序我只喜欢两句话: ①,free 只是释放的str指向的内存空间,它本身的值还是存在的.所以free之后,有一个好的习惯就是将str=NULL. ②,尽管这段程序确实是存在大大的问题但是通常会打印出world来,这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的。 ) void GetMemory(char **p,int num) { //p,指向指针的指针,*p,p指向的指针(即str),**p,最终的对象,str指向的单元 *p=(char *)malloc(num); //申请空间首地址付给传入的被p指向的指针,即str } int main() { char *str=NULL; GetMemory(str,100); //传入指针变量本身的地址 strcpy(str,”hello”); free(str); if(str!=NULL) { strcpy(str,”world”); } printf(“\n str is %s”,str); 软件开发网 getchar(); } 问输出结果是什么? 答案:输出str is world。 free 只是释放的str指向的内存空间,它本身的值还是存在的.所以free之后,有一个好的习惯就是将str=NULL. 此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的, 尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world来。 这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。 当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存 前面一点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的。 5,char a[10]; strlen(a)为什么等于15? 其实strlen(a)的值是不确定的,因为strlen是以\0作为结束符,所以不确定 6, 一语句实现x是否为2的若干次幂的判断 int i = 512; cout boolalpha ((i (i - 1)) ? false : true) endl;(我认为这段

文档评论(0)

勤能补拙 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档