http://www.oschina.net/question/213217_69069
1,gets() 方法Q:以下代码有个被隐藏住的问题,你能找到它吗?01#include0203intmain(void)04{05charbuff[10];06memset(buff,0,sizeof(buff));0708gets(buff);0910printf("\n The buffer entered is [%s]\n",buff);1112return0;13}


A:这个不显眼的问题就是使用了 gets() 方法。此方法接受一个string类型参数,但是却没有检测此数值是否有足够的空间来拷贝数据。所以这里我们一般用 fgets() 方法将来的更好。
2,strcpy() 方法Q:密码防护是很基本的功能,看看能否搞定下面这段代码?01#include0203intmain(intargc,char*argv[])04{05intflag = 0;06charpasswd[10];0708memset(passwd,0,sizeof(passwd));0910strcpy(passwd, argv[1]);1112if(0 ==strcmp("LinuxGeek", passwd))13{14flag = 1;15}1617if(flag)18{19printf("\n Password cracked \n");20}21else22{23printf("\n Incorrect passwd \n");2425}26return0;27}

3,main() 方法的返回类型Q:请问下面这段代码能否通过编译?如果能的话,那么这段代码中隐含什么问题吗?01#include0203voidmain(void)04{05char*ptr = (char*)malloc(10);0607if(NULL == ptr)08{09printf("\n Malloc failed \n");10return;11}12else13{14// Do some processing1516free(ptr);17}1819return;20}

A:答案是代码能通过编译,但是会留下针对main()方法的返回类型的警告。main()方法的真正返回类型应该为'int'而非'void'。这是因为'int'返回类型能够让程序返回状态值。尤其是当这段程序作为其他应用的附属程序时这个状态值将更加重要。

4,内存泄露Q:请问以下代码有内存泄露吗?01#include0203voidmain(void)04{05char*ptr = (char*)malloc(10);0607if(NULL == ptr)08{09printf("\n Malloc failed \n");10return;11}12else13{14// Do some processing15}1617return;18}

A:好,虽然上面的代码没有对指针 ptr 进行内存释放,但实际上即使是程序结束也不会造成内存泄露,因为当程序结束时所有一开始被占据的内存就全部清空了。但如果上面这段代码是在 while 循环里面那将会造成严重的问题。

Note: 如果你需要了解更多关于内存泄露的问题以及如何使用工具检测内存泄露,你可以参考这篇文章Valgrind
5,free() 方法Q:以下代码当用户输入'freeze'时会奔溃,而如果输入'zebra'则运行正常,这是为什么?01#include0203intmain(intargc,char*argv[])04{05char*ptr = (char*)malloc(10);0607if(NULL == ptr)08{09printf("\n Malloc failed \n");10return-1;11}12elseif(argc == 1)13{14printf("\n Usage \n");15}16else17{18memset(ptr, 0, 10);1920strncpy(ptr, argv[1], 9);2122while(*ptr !='z')23{24if(*ptr =='')25break;26else27ptr ;28}2930if(*ptr =='z')31{32printf("\n String contains 'z'\n");33// Do some more processing34}3536free(ptr);37}3839return0;40}

A:问题的根源是因为代码在while循环中改变了 ptr 指针的地址。当输入为'zebra'时,while循环甚至在执行第一遍前就结束了,所以free()释放的内存地址就是一开始malloc()分配的地址。但是当输入'freeze'时,ptr记录的地址在while循环中被更改,因为将会是错误的地址传递到free()方法中引起崩溃。
6,atexit with _exitQ:在以下代码,atexit()方法并没有被调用,你知道为什么吗?01#include0203voidfunc(void)04{05printf("\n Cleanup function called \n");06return;07}0809intmain(void)10{11inti = 0;1213atexit(func);1415for(;i<0xffffff;i );1617_exit(0);18}

A:这是因为使用了 _exit() 方法。此方法并没有调用清除数据相关的方法,比如 atexit()等。
7,void* 与 C 结构体Q:能否设计一个方法接受任意类型的参数然后返回整数?同时是否有办法传递多个这样的参数?A:一个能接受任意类型参数的方法像下面这个样子:1intfunc(void*ptr)

如果需要传递多个参数,那么我们可以传递一个包含这些参数的结构体
8,* 与 操作符Q:以下代码将输出什么?为什么?01#include0203intmain(void)04{05char*ptr ="Linux";06printf("\n [%c] \n",*ptr );07printf("\n [%c] \n",*ptr);0809return0;10}

A:以上的输出将是:1[L]23[i]

因为 与 * 的优先级一样,所以 *ptr 将会从右向左操作。按照这个逻辑,ptr 会先执行然后执行*ptr。所以第一个结果是'L'。也因为 被执行了,所以下一个printf() 结果是'i'。
9,Making changes in Code segmentQ:以下代码运行时一定会崩溃,你能说出原因吗?01#include0203intmain(void)04{05char*ptr ="Linux";06*ptr ='T';0708printf("\n [%s] \n", ptr);0910return0;11}

A:这是因为,通过 *ptr = 'T',此行代码尝试更改只读内存存储的字符串'Linux'。此操作当然行不通所以才会造成崩溃。
10,Process that changes its own nameQ:你能否写一个程序在它运行时修改它的名称?A:以下代码可以完成01#include0203intmain(intargc,char*argv[])04{05inti = 0;06charbuff[100];0708memset(buff,0,sizeof(buff));0910strncpy(buff, argv[0],sizeof(buff));11memset(argv[0],0,strlen(buff));1213strncpy(argv[0],"NewName", 7);1415// Simulate a wait. Check the process16// name at this point.17for(;i<0xffffffff;i );1819return0;20}

11,局部变量的返回地址Q:下面的代码有问题吗?如果有,如何修改?01#include0203int* inc(intval)04{05inta = val;06a ;07returna;08}0910intmain(void)11{12inta = 10;1314int*val = inc(a);1516printf("\n Incremented value is equal to [%d] \n", *val);1718return0;19}
A:虽然上面的代码有时运行会很好,但是在方法 inc() 中有很严重的隐患。当inc()方法执行后,再次使用局部变量的地址就会造成不可估量的结果。解决之道就是传递变量a的地址给main()。
12,处理 printf() 参数Q:以下代码输出请问是什么?view sourceprint?01#include0203intmain(void)04{05inta = 10, b = 20, c = 30;0607printf("\n %d..%d..%d \n", a b c, (b = b*2), (c = c*2));0809return0;10}

A:输出将是1110..40..60

这是因为参数都是从右向左处理的,然后打印出来却是从左向右。

转载于:https://blog.51cto.com/5911289/986756

12个有趣的C语言问答_sunyrising-ChinaUnix博客相关推荐

  1. linux编译有趣c程序,12个有趣的C语言问答(详解)

    12个有趣的C语言问答(详解) 1 gets()方法 Q:下面的代码有一个被隐藏的问题,你能找到它吗? 1 #include 2 3 int main(void) 4 { 5    char buff ...

  2. c语言滑稽的编程,12个滑稽的C语言面试问答——《12个有趣的C语言问答》评析(5)...

    A,局部变量的返回地址 Q:下面的代码有问题吗?如果有,如何修改? #include int* inc(int val) { int a = val; a++; return &a; } in ...

  3. 六款小巧的HTTP Server[C语言] - 贵贵的博客 - 开发|架构|开源|共享

    六款小巧的HTTP Server[C语言] - 贵贵的博客 - 开发|架构|开源|共享 六款小巧的HTTP Server[C语言] keminar 发表于 2010-02-05 23:14:41. 发 ...

  4. swift5 ios的国际化(本地化,全球化,多语言)(最主要博客)

    文章目录 1.我主要参考的是这位大神的博客 1.1 要注意的地方1 1.2 要注意的地方2 2.storyboard的国际化 3. 在APP内切换语言 3.1 代码 LocalizableManage ...

  5. 12个有趣的C语言面试题及答案

    12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出下面代码里的问题: #include<stdio.h> int main( ...

  6. 12个有趣的C语言面试题

    摘要:12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出下面代码里的问题: #include<stdio.h> int ma ...

  7. C语言第五次博客作业

    一.PTA实验作业 题目1:6-6 使用函数输出水仙花数 1. 本题PTA提交列表 2. 设计思路 (1) 首先先定义narcissistic函数. (2)定义四个整形变量n,a,d,cnt,sum, ...

  8. a5 1c语言实现,初识C语言1_qq5fb3b05a5f322的技术博客_51CTO博客

    本章重点: 什么是C语言 第一个C语言程序 数据类型 变量.常量 字符串+转义字符+注释 选择语句 循环语句 函数 数组 操作符 常见关键字 define 定义常量和宏 指针 结构体 什么是C语言? ...

  9. C语言第五次博客作业---函数

    一.PTA实验作业 题目1. 使用函数判断完全平方数 1. 本题PTA提交列表(要提交列表,不是结果) 2. 设计思路(此处用流程图最好) 1.主函数 (1)定义变量n存放用户传入的参数 (2)输入数 ...

最新文章

  1. 另类的 高版本数据库 转换到 低版本数据库
  2. ZOJ 2112 Dynamic Rankings
  3. 收集21个经典Java面试题
  4. .NET Core 2.0体验
  5. 1x1 11b g n linux,基于RN1810下的2.4 GHz IEEE 802.11b/g/n无线模块
  6. 本地使用Rfam 12.0+
  7. Nodejs 内置模块的基本使用
  8. 维护UI状态的最懒惰方法
  9. factorymenu什么意思_宏基20lsquo;显示屏AUTO和MENU是什么意思,在什么位置_已解决 - 阿里巴巴生意经...
  10. Nginx设置expires设定页面缓存时间
  11. 分享一个响应式电商网站前端模板
  12. 使用VMware创建DOS虚拟机
  13. MATLAB 插值放大
  14. 项目管理助力组织赢在VUCA时代
  15. 应用计算机测定线性电阻伏安特性实验器材,实验一电路元件伏安特性的测试
  16. 我是如何从电脑小白走上编程之路
  17. 直播APP开发需要具备哪些功能?
  18. main函数的argc与arg
  19. 如何为360浏览器设置http代理服务器
  20. 使用随机森林做特征选择

热门文章

  1. 一车abs线路怎么量_神木沥青拌合站烧火油怎么购买更划算
  2. c#连接远程sqlserver2008_利用远程调试工具调试mitmproxy和fiddlercore
  3. End-to-end Recovery of Human Shape and Pose
  4. 24解析函数的级数表示(三)
  5. 利用可分离卷积UNet进行木薯叶病分类
  6. php滑动轮播效果,js实现移动端手指滑动轮播图效果
  7. 连通域的原理与Python实现
  8. 互联网运营数据分析(5): 流失分析
  9. python格式化字符串_Python字符串格式化问题:%、format()与f-strings
  10. 数据库decimal对应java什么类型_mysql decimal(10,2)对应java类型