TOP

C语言编程笔记丨12个有趣的C语言问答(一)
2019-03-28 14:09:32 】 浏览:195
Tags:语言编程 笔记 有趣 语言 问答

0. gets() 方法

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

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

#include<stdio.h>

int main(void)

{

    char buff[10];

    memset(buff,0,sizeof(buff));

    gets(buff);

    printf("\n The buffer entered is [%s]\n",buff);

    return 0;

}

1,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("\n Password cracked \n");

    }

    else

    {

        printf("\n Incorrect passwd \n");

    }

    return 0;

}

2,main() 方法的返回类型

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

#include<stdio.h>

void main(void)

{

    char *ptr = (char*)malloc(10);

    if(NULL == ptr)

    {

        printf("\n Malloc failed \n");

        return;

    }

    else

    {

        // Do some processing

        free(ptr);

    }

    return;

}

A:答案是代码能通过编译,但是会留下针对main()方法的返回类型的警告。main()方法的真正返回类型应该为’int’而非’void’。这是因为’int’返回类型能够让程序返回状态值。尤其是当这段程序作为其他应用的附属程序时这个状态值将更加重要。

3,内存泄露

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

#include<stdio.h>

void main(void)

{

    char *ptr = (char*)malloc(10);

    if(NULL == ptr)

    {

        printf("\n Malloc failed \n");

        return;

    }

    else

    {

        // Do some processing

    }

    return;

}

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

4,free() 方法

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

#include<stdio.h>

int main(int argc, char *argv[])

{

    char *ptr = (char*)malloc(10);

    if(NULL == ptr)

    {

        printf("\n Malloc failed \n");

        return -1;

    }

    else if(argc == 1)

    {

        printf("\n Usage  \n");

    }

    else

    {

        memset(ptr, 0, 10);

        strncpy(ptr, argv[1], 9);

        while(*ptr != 'z')

        {

            if(*ptr == '')

                break;

            else

                ptr++;

        }

        if(*ptr == 'z')

        {

            printf("\n String contains 'z'\n");

            // Do some more processing

        }

       free(ptr);

    }

    return 0;

}

A:问题的根源是因为代码在while循环中改变了 ptr 指针的地址。当输入为’zebra’时,while循环甚至在执行 第一遍前就结束了,所以free()释放的内存地址就是一开始malloc()分配的地址。但是当输入’freeze’时, ptr记录的地址在while循环中被更改,因为将会是错误的地址传递到free()方法中引起崩溃。

5,atexit with _exit

Q:在以下代码,atexit()方法并没有被调用,你知道为什么吗?

#include<stdio.h>

void func(void)

{

    printf("\n Cleanup function called \n");

    return;

}

int main(void)

{

    int i = 0;

    atexit(func);

    for(;i<0xffffff;i++);

    _exit(0);

}

A:这是因为使用了 _exit() 方法。此方法并没有调用清除数据相关的方法,比如 atexit()等。

6,void* 与 C 结构体

Q:能否设计一个方法接受任意类型的参数然后返回整数?同时是否有办法传递多个这样的参数?

A:一个能接受任意类型参数的方法像下面这个样子:

int func(void *ptr)

如果需要传递多个参数,那么我们可以传递一个包含这些参数的结构体

7,* 与 ++ 操作符

Q:以下代码将输出什么?为什么?

#include<stdio.h>

int main(void)

{

    char *ptr = "Linux";

    printf("\n [%c] \n",*ptr++);

    printf("\n [%c] \n",*ptr);

    return 0;

}

A:以上的输出将是:

因为++与 * 的优先级一样,所以 *ptr++ 将会从右向左操作。按照这个逻辑,ptr++ 会先执行然后执行*ptr。所以第一个结果是’L’。也因为 ++ 被执行了,所以下一个printf() 结果是’i’。

8,Making changes i
C语言编程笔记丨12个有趣的C语言问答(一) https://www.cppentry.com/bencandy.php?fid=45&id=216142

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言字符数组回顾 下一篇C语言学习笔记丨带你五分钟了解指..