12个有趣的C语言问答

时间:2017-06-15 17:52

有趣的C语言解密,你能猜出他们的结果吗,能说明为什么会有这样的结果呢。

1,gets() 方法

  Q:以下代码有个被隐藏住的问题,你能找到它吗?

#include<stdio.h>

  

int main(void) {     char buff[10];     memset(buff,0,sizeof(buff));        gets(buff);        printf("  The buffer entered is [%s] ",buff);        return 0; }

A:这个不显眼的问题就是使用了 gets() 方法。此方法接受一个string类型参数,但是却没有检测此数值是否 有足够的空间来拷贝数据。所以这里我们一般用 fgets() 方法将来的更好。

2,strcpy() 方法

  Q:密码防护是很基本的功能,看看能否搞定下面这段代码?

#include<stdio.h>    int main(int argc, char *argv[]) {     int flag = 0;     char passwd[10];        memset(passwd,0,sizeof(passwd));        strcpy(passwd, argv[1]);        if(0 == strcmp("LinuxGeek", passwd))     {         flag = 1;     }        if(flag)     {         printf("  Password cracked  ");     }     else     {         printf("  Incorrect passwd  ");        }     return 0; }3,main() 方法的返回类型

  Q:请问下面这段代码能否通过编译?如果能的话,那么这段代码中隐含什么问题吗?

#include<stdio.h>    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'返回类型能够让程序返回状态值。尤其是当这段程序作为其他应用的附属程序时这个状态值将更加重要。

4,内存泄露

  Q:请问以下代码有内存泄露吗?

#include<stdio.h>    void main(void) {     char *ptr = (char*)malloc(10);        if(NULL == ptr)     {         printf("  Malloc failed  ");         return;     }     else     {         // Do some processing     }        return; }


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

  Note: 如果你需要了解更多关于内存泄露的问题以及如何使用工具检测内存泄露,你可以参考这篇文章Valgrind

5,free() 方法

Q:以下代码当用户输入'freeze'时会奔溃,而如果输入'zebra'则运行正常,这是为什么?

#include<stdio.h>    int main(int argc, char *argv[]) {     char *ptr = (char*)malloc(10);        if(NULL == ptr)     {         printf("  Malloc failed  ");         return -1;     }     else if(argc == 1)     {         printf("  Usage   ");     }     else     {         memset(ptr, 0, 10);            strncpy(ptr, argv[1], 9);            while(*ptr != 'z')         {             if(*ptr == '')                 break;             else                 ptr++;         }            if(*ptr == 'z')         {             printf("  String contains 'z' ");             // Do some more processing         }           free(ptr);     }        return 0; }