C语言中一些函数的奥妙之处-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

C语言中一些函数的奥妙之处

例如以下问题您知道他们的答案吗?
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}

展开
收起
a123456678 2016-03-03 18:06:41 2481 0
1 条回答
写回答
取消 提交回答
  • a123456678

    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()方法中引起崩溃。

    2019-07-17 18:51:45
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载