例如以下问题您知道他们的答案吗?
1,gets() 方法
Q:以下代码有个被隐藏住的问题,你能找到它吗?
1 clude<stdio.h>
2
3 int main(void)
4 {
5 char buff[10];
6 memset(buff,0,sizeof(buff));
7
8 gets(buff);
9
10 printf("\n The buffer entered is [%s]\n",buff);
11
12 return 0;
13 }
2,strcpy() 方法
Q:密码防护是很基本的功能,看看能否搞定下面这段代码?
1 #include<stdio.h>
2
3 int main(int argc, char *argv[])
4 {
5 int flag = 0;
6 char passwd[10];
7
8 memset(passwd,0,sizeof(passwd));
9
10 strcpy(passwd, argv[1]);
11
12 if(0 == strcmp("LinuxGeek", passwd))
13 {
14 flag = 1;
15 }
16
17 if(flag)
18 {
19 printf("\n Password cracked \n");
20 }
21 else
22 {
23 printf("\n Incorrect passwd \n");
24
25 }
26 return 0;
27 }
3,main() 方法的返回类型
Q:请问下面这段代码能否通过编译?如果能的话,那么这段代码中隐含什么问题吗?
1 #include<stdio.h>
2
3 void main(void)
4 {
5 char *ptr = (char*)malloc(10);
6
7 if(NULL == ptr)
8 {
9 printf("\n Malloc failed \n");
10 return;
11 }
12 else
13 {
14 // Do some processing
15
16 free(ptr);
17 }
18
19 return;
20 }
4,内存泄露
Q:请问以下代码有内存泄露吗?
1 #include<stdio.h>
2
3 void main(void)
4 {
5 char *ptr = (char*)malloc(10);
6
7 if(NULL == ptr)
8 {
9 printf("\n Malloc failed \n");
10 return;
11 }
12 else
13 {
14 // Do some processing
15 }
16
17 return;
18}
5,free() 方法
Q:以下代码当用户输入'freeze'时会奔溃,而如果输入'zebra'则运行正常,这是为什么?
1 #include<stdio.h>
2
3 int main(int argc, char *argv[])
4 {
5 char *ptr = (char*)malloc(10);
6
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
20 strncpy(ptr, argv[1], 9);
21
22 while(*ptr != 'z')
23 {
24 if(*ptr == '')
25 break;
26 else
27 ptr++;
28 }
29
30 if(*ptr == 'z')
31 {
32 printf("\n String contains 'z'\n");
33 // Do some more processing
34 }
35
36 free(ptr);
37 }
38
39 return 0;
40}
6,atexit with _exit
Q:在以下代码,atexit()方法并没有被调用,你知道为什么吗?
1 #include<stdio.h>
2
3 void func(void)
4 {
5 printf("\n Cleanup function called \n");
6 return;
7 }
8
9 int main(void)
10{
11 int i = 0;
12
13 atexit(func);
14
15 for(;i<0xffffff;i++);
16
17 _exit(0);
18}
7,void* 与 C 结构体
Q:能否设计一个方法接受任意类型的参数然后返回整数?同时是否有办法传递多个这样的参数?
8,* 与 ++ 操作符
Q:以下代码将输出什么?为什么?
1 #include<stdio.h>
2
3 int main(void)
4 {
5 char *ptr = "Linux";
6 printf("\n [%c] \n",*ptr++);
7 printf("\n [%c] \n",*ptr);
8
9 return 0;
10}
9,Making changes in Code segment
Q:以下代码运行时一定会崩溃,你能说出原因吗?
1 #include<stdio.h>
2
3 int main(void)
4 {
5 char *ptr = "Linux";
6 *ptr = 'T';
7
8 printf("\n [%s] \n", ptr);
9
10 return 0;
11}
10,Process that changes its own name
Q:你能否写一个程序在它运行时修改它的名称?
A:以下代码可以完成
1 #include<stdio.h>
2
3 int main(int argc, char *argv[])
4 {
5 int i = 0;
6 char buff[100];
7
8 memset(buff,0,sizeof(buff));
9
10 strncpy(buff, argv[0], sizeof(buff));
11 memset(argv[0],0,strlen(buff));
12
13 strncpy(argv[0], "NewName", 7);
14
15 // Simulate a wait. Check the process
16 // name at this point.
17 for(;i<0xffffffff;i++);
18
19 return 0;
20}
11,局部变量的返回地址
Q:下面的代码有问题吗?如果有,如何修改?
1 #include<stdio.h>
2
3 int* inc(int val)
4 {
5 int a = val;
6 a++;
7 return &a;
8}
9
10 int main(void)
11 {
12 int a = 10;
13
14 int *val = inc(a);
15
16 printf("\n Incremented value is equal to [%d] \n", *val);
17
18 return 0;
19}
12,处理 printf() 参数
Q:以下代码输出请问是什么?
1 #include<stdio.h>
2
3 int main(void)
4 {
5 int a = 10, b = 20, c = 30;
6
7 printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2));
8
9 return 0;
10}
A:这个不显眼的问题就是使用了 gets() 方法。此方法接受一个string类型参数,但是却没有检测此数值是否有足够的空间来拷贝数据。所以这里我们一般用 fgets() 方法将来的更好。
A:答案是代码能通过编译,但是会留下针对main()方法的返回类型的警告。main()方法的真正返回类型应该为'int'而非'void'。这是因为'int'返回类型能够让程序返回状态值。尤其是当这段程序作为其他应用的附属程序时这个状态值将更加重要。
A:好,虽然上面的代码没有对指针 ptr 进行内存释放,但实际上即使是程序结束也不会造成内存泄露,因为当程序结束时所有一开始被占据的内存就全部清空了。但如果上面这段代码是在 while 循环里面那将会造成严重的问题。
Note: 如果你需要了解更多关于内存泄露的问题以及如何使用工具检测内存泄露,你可以参考这篇文章 Valgrind
A:问题的根源是因为代码在while循环中改变了 ptr 指针的地址。当输入为'zebra'时,while循环甚至在执行 第一遍前就结束了,所以free()释放的内存地址就是一开始malloc()分配的地址。但是当输入'freeze'时, ptr记录的地址在while循环中被更改,因为将会是错误的地址传递到free()方法中引起崩溃。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。