直击C语言——7个有趣的问答
1.gets() 方法 Q:以下代码有个被隐藏住的问题,你能找到它吗? A:这个不显眼的问题就是使用了 gets() 方法。此方法接受一个string类型参数,但是却没有检测此数值是否 有足够的空间来拷贝数据。所以这里我们一般用 fgets() 方法将来的更好。 #include int?main(void) { char?buff[10]; memset(buff,sizeof(buff)); gets(buff); printf(" The buffer entered is [%s] ",buff); return?0; } 2,main() 方法的返回类型 Q:请问下面这段代码能否通过编译?如果能的话,那么这段代码中隐含什么问题吗? #include void?main(void) { char?*ptr = (char*)malloc(10); if(NULL?== ptr) { printf(" Malloc failed "); return; } else { // Do some processing free(ptr); } return; } A:答案是代码能通过编译,但是会留下针对main()方法的返回类型的警告。main()方法的真正返回类型应该为’int’而非’void’。这是因为’int’返回类型能够让程序返回状态值。尤其是当这段程序作为其他应用的附属程序时这个状态值将更加重要。 3,内存泄露 Q:请问以下代码有内存泄露吗? #include void?main(void) { char?*ptr = (char*)malloc(10); if(NULL?== ptr) { printf(" Malloc failed "); return; } else { // Do some processing } return; } A:好,虽然上面的代码没有对指针 ptr 进行内存释放,但实际上即使是程序结束也不会造成内存泄露,因为当程序结束时所有一开始被占据的内存就全部清空了。但如果上面这段代码是在 while 循环里面那将会造成严重的问题。 4,void* 与 C 结构体 Q:能否设计一个方法接受任意类型的参数然后返回整数?同时是否有办法传递多个这样的参数? A:一个能接受任意类型参数的方法像下面这个样子: int?func(void?*ptr) 如果需要传递多个参数,那么我们可以传递一个包含这些参数的结构体 5,* 与 ++ 操作符 Q:以下代码将输出什么?为什么? #include int?main(void) { char?*ptr = "Linux"; printf(" [%c] ",*ptr++); printf(" [%c] ",*ptr); return?0; } A:以上的输出将是: 因为++与 * 的优先级一样,所以 *ptr++ 将会从右向左操作。按照这个逻辑,ptr++ 会先执行然后执行*ptr。所以第一个结果是’L’。也因为 ++ 被执行了,所以下一个printf() 结果是’i’。 6,局部变量的返回地址 Q:下面的代码有问题吗?如果有,如何修改? #include int* inc(int?val) { int?a = val; a++; return?&a; } int?main(void) { int?a = 10; int?*val = inc(a); printf(" Incremented value is equal to [%d] ",*val); return?0; } A:虽然上面的代码有时运行会很好,但是在方法 inc() 中有很严重的隐患。当inc()方法执行后,再次使用局部变量的地址就会造成不可估量的结果。解决之道就是传递变量a的地址给main()。 7,处理 printf() 参数 Q:以下代码输出请问是什么? #include int?main(void) { int?a = 10,b = 20,c = 30; printf(" %d..%d..%d ",a+b+c,(b = b*2),(c = c*2)); return?0; } A:输出将是 110..40..60 这是因为参数都是从右向左处理的,打印出来却是从左向右。 喜欢文章的可以给小编关注以及点赞 想学习c/c++的小伙伴可以加群:941636044,私聊群主领取C语言基础资料哦~ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Flexigrid仅选一行设置、获取行ID、取Cell文本
- ajax POST跨域请求完美解决
- 使用react-native facebook SDK获取用户app令牌
- Mshflexgrid控件填写数据时的添加方式的改变,加快数据读取速
- 编写便携式c / c程序时,使用外部文件的最佳方法是什么?
- 烧写NAND Flash时出现错误:*** Warning - bad CRC or NAND
- 【VS开发】【计算机视觉】OpenCV读写xml文件《C++版本》
- Swift 2.3迁到3.0的一些细节(不定期写)
- xml-读写查-基本步骤
- objective-c – 检测Objective C(Mac OS X)中的CPU架构(32位