UDN-企业互联网技术人气社区

板块导航

浏览  : 1205
回复  : 0

[面试技巧] C语言面试题收集

[复制链接]
舞操的头像 楼主
发表于 2015-12-28 18:42:03 | 显示全部楼层 |阅读模式

  问题摘录:

  free函数的操作参数必须是申请同一片内存空间时malloc返回的起始地址,否则出错。问题和实例代码如下:下面的程序会在用户输入'freeze'的时候出问题,而'zebra'则不会,为什么?

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main(int argc, char argv[])
  5. {
  6.     char ptr = (char)malloc(10);

  7.     if(NULL == ptr)
  8.     {
  9.         printf("\n Malloc failed \n");
  10.         return -1;
  11.     }
  12.     else if(argc == 1)
  13.     {
  14.         printf("\n Usage  \n");
  15.     }
  16.     else
  17.     {
  18.         memset(ptr, 0, 10);

  19.         // strncpy(dest,source,num):dest指向目标缓存、source指向源缓存、
  20.         // num为要拷贝的字节数,如果num超过dest的空间,则报错
  21.         strncpy(ptr, argv[1], 9);

  22.         while(ptr != 'z')
  23.         {
  24.             if(ptr == ' ')
  25.                 break;
  26.             else
  27.                 ptr++;
  28.         }

  29.         if(ptr == 'z')
  30.         {
  31.             printf("\n String contains 'z'\n");
  32.             // Do some more processing
  33.         }

  34.        free(ptr);
  35.     }

  36.     return 0;
  37. }
复制代码


  - _exit()、exit()、atexit()函数的区别:

  _exit():直接进入内核,属于POSIX标准

  exit(): ANSI C标准。先做一些清理工作,例如关闭打开的文件,将缓存区的数据写回到文件中,最后再调用_exit()。

  atexit():C语言可以利用atexit(func)注册函数func,作为在main函数结束之后的一些操作,其中func为void类型。


  在下面这段代码中,func并没有被调用,就是因为这里用的是_exit()。

  1. #include<stdio.h>

  2. void func(void)
  3. {
  4.     printf("\n Cleanup function called \n");
  5.     return;
  6. }

  7. int main(void)
  8. {
  9.     int i = 0;

  10.     atexit(func);

  11.     for(;i
复制代码



  在《C语言十二题part1》中,第二题的答案,想法挺好,但是实际运行的时候,并没有他说的那种效果。代码如下:当输入超过10个字符的时候,编译器会检查出错误~

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main(int argc, char argv[])
  5. {
  6.     int flag = 0;
  7.     char passwd[10];

  8.     // memset(dest,c,sizeof(dest)):将dest指向的缓存全部置为c
  9.     memset(passwd,0,sizeof(passwd));

  10.     //char p = (char*)malloc(10);
  11.     //strcpy(passwd, argv[1]);
  12.     scanf("%s",passwd);

  13.     if(0 == strcmp("LinuxGeek", passwd))
  14.     {
  15.         flag = 1;
  16.     }

  17.     if(flag)
  18.     {
  19.         printf("\n Password cracked \n");
  20.     }
  21.     else
  22.     {
  23.         printf("\n Incorrect passwd \n");

  24.     }
  25.     return 0;
  26. }
复制代码

 
  *和++的优先级一样, 前置++和后置++的不同

  1. #include<stdio.h>

  2. int main(void)
  3. {
  4.     char ptr = "Linux";
  5.     printf("\n [%c] \n",ptr++);
  6.     //printf("\n [%c] \n",++ptr);
  7.     printf("\n [%c] \n",ptr);

  8.     return 0;
  9. }
复制代码


  常量字符串不能修改,C风格字符串的知识点

  1. #include<stdio.h>

  2. int main(void)
  3. {
  4.     char ptr = "Linux";
  5.     ptr = 'T';  // 错误,此处ptr指向的是常量字符串,它的值是常量字符串的首字符的地址,即L的地址,而这句话试图修改L为T,发生错误

  6.     printf("\n [%s] \n", ptr);

  7.     return 0;
  8. }
复制代码


  能够修改自己名字的进程,哈哈,有点意思,修改argv[0]即可。

  1. #include<stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.     int i = 0;
  5.     char buff[100];

  6.     memset(buff,0,sizeof(buff));  // 初始化buff

  7.     strncpy(buff, argv[0], sizeof(buff));  //将原来的进程名拷贝到buff中
  8.     memset(argv[0],0,strlen(buff));  // 将argv[0]置为0

  9.     strncpy(argv[0], "NewName", 7);  //将新名字拷贝进argv[0]中

  10.     // Simulate a wait. Check the process
  11.     // name at this point.
  12.     for(;i
复制代码


  变量的生存周期和函数的值传递性质

  1. #include<stdio.h>

  2. int inc(int val)
  3. {
  4.   int a = val;
  5.   a++;
  6.   return &a;
  7. //严重漏洞,不可返回本地变量a的地址,因为a的生命周期仅仅是在inc这个函数中
  8. }

  9. int main(void)
  10. {
  11.     int a = 10;
  12.     int val = inc(a);
  13.     printf("\n Incremented value is equal to [%d] \n", *val);

  14.     return 0;
  15. }
复制代码


  printf()函数的参数是从右往左处理,因为参数一般为从右往左压栈的,这是因为C语言为了支持可变参数而确立的一个特性!

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. int a = 10, b = 20, c = 30;
  5. printf("\n %d..%d..%d \n", a+b+c, (b = b2), (c = c2));

  6. return 0;
  7. }
复制代码


  输出结果如下:

  1. 110..40..60
复制代码

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部