http://www.oschina.net/question/213217_69069 A:答案是代码能通过编译,但是会留下针对main()方法的返回类型的警告。main()方法的真正返回类型应该为'int'而非'void'。这是因为'int'返回类型能够让程序返回状态值。尤其是当这段程序作为其他应用的附属程序时这个状态值将更加重要。 A:好,虽然上面的代码没有对指针 ptr 进行内存释放,但实际上即使是程序结束也不会造成内存泄露,因为当程序结束时所有一开始被占据的内存就全部清空了。但如果上面这段代码是在 while 循环里面那将会造成严重的问题。
1,gets() 方法Q:以下代码有个被隐藏住的问题,你能找到它吗?01#include
A:这个不显眼的问题就是使用了 gets() 方法。此方法接受一个string类型参数,但是却没有检测此数值是否有足够的空间来拷贝数据。所以这里我们一般用 fgets() 方法将来的更好。
2,strcpy() 方法Q:密码防护是很基本的功能,看看能否搞定下面这段代码?01#include
3,main() 方法的返回类型Q:请问下面这段代码能否通过编译?如果能的话,那么这段代码中隐含什么问题吗?01#include
5,free() 方法Q:以下代码当用户输入'freeze'时会奔溃,而如果输入'zebra'则运行正常,这是为什么?01#include
A:问题的根源是因为代码在while循环中改变了 ptr 指针的地址。当输入为'zebra'时,while循环甚至在执行第一遍前就结束了,所以free()释放的内存地址就是一开始malloc()分配的地址。但是当输入'freeze'时,ptr记录的地址在while循环中被更改,因为将会是错误的地址传递到free()方法中引起崩溃。
6,atexit with _exitQ:在以下代码,atexit()方法并没有被调用,你知道为什么吗?01#include
A:这是因为使用了 _exit() 方法。此方法并没有调用清除数据相关的方法,比如 atexit()等。
7,void* 与 C 结构体Q:能否设计一个方法接受任意类型的参数然后返回整数?同时是否有办法传递多个这样的参数?A:一个能接受任意类型参数的方法像下面这个样子:1intfunc(void*ptr)
如果需要传递多个参数,那么我们可以传递一个包含这些参数的结构体
8,* 与 操作符Q:以下代码将输出什么?为什么?01#include
A:以上的输出将是:1[L]23[i]
因为 与 * 的优先级一样,所以 *ptr 将会从右向左操作。按照这个逻辑,ptr 会先执行然后执行*ptr。所以第一个结果是'L'。也因为 被执行了,所以下一个printf() 结果是'i'。
9,Making changes in Code segmentQ:以下代码运行时一定会崩溃,你能说出原因吗?01#include
A:这是因为,通过 *ptr = 'T',此行代码尝试更改只读内存存储的字符串'Linux'。此操作当然行不通所以才会造成崩溃。
10,Process that changes its own nameQ:你能否写一个程序在它运行时修改它的名称?A:以下代码可以完成01#include
11,局部变量的返回地址Q:下面的代码有问题吗?如果有,如何修改?01#include
A:虽然上面的代码有时运行会很好,但是在方法 inc() 中有很严重的隐患。当inc()方法执行后,再次使用局部变量的地址就会造成不可估量的结果。解决之道就是传递变量a的地址给main()。
12,处理 printf() 参数Q:以下代码输出请问是什么?view source
12个有趣的C语言问答_sunyrising-ChinaUnix博客
原创
©著作权归作者所有:来自51CTO博客作者maolala的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
51c自动驾驶~合集12自动驾驶
-
c语言:有趣的printf输出,“4321”
c语言:有趣的printf输出,“4321”
c语言:有趣的printf输出 “4321” -
c语言:有趣的转义字符用法
c语言:有趣的转义字符用法
c语言:有趣的转义字符用法