iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >12个有趣的C语言问答分别是怎样的
  • 170
分享到

12个有趣的C语言问答分别是怎样的

2023-06-17 09:06:15 170人浏览 安东尼
摘要

本篇文章为大家展示了12个有趣的C语言问答分别是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。0,gets() 方法Q:以下代码有个被隐藏住的问题,你能找到它吗?A:这个不显眼的问题就是使用了

本篇文章为大家展示了12个有趣的C语言问答分别是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

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;  }

12个有趣的C语言问答分别是怎样的

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()方法的真正返回类型应该为&rsquo;int&rsquo;而非&rsquo;void&rsquo;。这是因为&rsquo;int&rsquo;返回类型能够让程序返回状态值。尤其是当这段程序作为其他应用的附属程序时这个状态值将更加重要。

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 循环里面那将会造成严重的问题

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

4,free() 方法

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

#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 指针的地址。当输入为&rsquo;zebra&rsquo;时,while循环甚至在执行 ***遍前就结束了,所以free()释放的内存地址就是一开始malloc()分配的地址。但是当输入&rsquo;freeze&rsquo;时, 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。所以***个结果是&rsquo;L'。也因为 ++ 被执行了,所以下一个printf() 结果是&rsquo;i'。

8,Making changes in Code segment

Q:以下代码运行时一定会崩溃,你能说出原因吗?

#include<stdio.h>     int main(void)  {      char *ptr = "Linux";      *ptr = 'T';         printf("\n [%s] \n", ptr);         return 0;  }

A:这是因为,通过 *ptr = &lsquo;T&rsquo;,此行代码尝试更改只读内存存储的字符串&rsquo;Linux&rsquo;。此操作当然行不通所以才会造成崩溃。

9,Process that changes its own name

Q:你能否写一个程序在它运行时修改它的名称?

A:以下代码可以完成

#include<stdio.h>     int main(int argc, char *argv[])  {      int i = 0;      char buff[100];         memset(buff,0,sizeof(buff));         strncpy(buff, argv[0], sizeof(buff));      memset(argv[0],0,strlen(buff));         strncpy(argv[0], "NewName", 7);         // Simulate a wait. Check the process      // name at this point.      for(;i<0xffffffff;i++);         return 0;  }

A,局部变量的返回地址

Q:下面的代码有问题吗?如果有,如何修改?

#include<stdio.h>     int* inc(int val)  {    int a = val;    a++;    return &a;  }     int main(void)  {      int a = 10;         int *val = inc(a);         printf("\n Incremented value is equal to [%d] \n", *val);         return 0;  }

A:虽然上面的代码有时运行会很好,但是在方法 inc() 中有很严重的隐患。当inc()方法执行后,再次使用局部变量的地址就会造成不可估量的结果。解决之道就是传递变量a的地址给main()。

B,处理 printf() 参数

Q:以下代码输出请问是什么?

#include<stdio.h>     int main(void)  {      int a = 10, b = 20, c = 30;         printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2));         return 0;  }

A:输出将是

110..40..60

这是因为参数都是从右向左处理的,然后打印出来却是从左向右。

上述内容就是12个有趣的C语言问答分别是怎样的,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网其他教程频道。

--结束END--

本文标题: 12个有趣的C语言问答分别是怎样的

本文链接: https://www.lsjlt.com/news/288145.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 12个有趣的C语言问答分别是怎样的
    本篇文章为大家展示了12个有趣的C语言问答分别是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。0,gets() 方法Q:以下代码有个被隐藏住的问题,你能找到它吗?A:这个不显眼的问题就是使用了...
    99+
    2023-06-17
  • JavaScript语法中12个需要绕开的陷阱分别是怎样的
    今天就跟大家聊聊有关JavaScript语法中12个需要绕开的陷阱分别是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。12种应该避免的Java...
    99+
    2024-04-02
  • 12 个GitHub上超火的JavaScript项目分别是怎样的
    12 个GitHub上超火的JavaScript项目分别是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 30-seconds-of...
    99+
    2024-04-02
  • 12个提高JavaScript 技能的概念分别是怎样的
    这期内容当中小编将会给大家带来有关12个提高JavaScript 技能的概念分别是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JavaScript 是一种复杂的语...
    99+
    2024-04-02
  • 10个JavaScript笔试题的问答是怎样的
    10个JavaScript笔试题的问答是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。作为JavaScript开发人员,...
    99+
    2024-04-02
  • C++语言的15个晦涩特性分别是什么
    本篇文章为大家展示了C++语言的15个晦涩特性分别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。这个列表收集了 C++ 语言的一些晦涩(Obscure)特性,是我经年累月研究这门语言...
    99+
    2023-06-17
  • 五种基于JVM的脚本语言分别是怎样的
    这期内容当中小编将会给大家带来有关五种基于JVM的脚本语言分别是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用...
    99+
    2023-06-17
  • Linux shell 30个有趣的命令和提示分别是什么
    本篇文章给大家分享的是有关Linux shell 30个有趣的命令和提示分别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。\1. 监控命令(每2秒运行一次) w...
    99+
    2023-06-28
  • Linux系统10个非常有趣的命令分别是什么
    这篇文章的内容主要围绕Linux系统10个非常有趣的命令分别是什么进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!1. sl 命令sl是指“steam...
    99+
    2023-06-28
  • C语言链表是怎么样的
    这篇文章将为大家详细讲解有关C语言链表是怎么样的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.链表概况1.1 链表的概念及结构概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序...
    99+
    2023-06-29
  • C语言中if语句的使用是怎样的
    本篇文章给大家分享的是有关C语言中if语句的使用是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。if语句:作用:构成分支结构。(它根据给定的条件进行判断,以决定执行某个分...
    99+
    2023-06-29
  • C语言结构体是怎么样的
    这篇文章给大家分享的是有关C语言结构体是怎么样的的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。结构体结构是一些值的集合,这些值称为成员变量。结构的每个成员是不同类型的变量。为什么要有结构体比如说,描述一个学生时,...
    99+
    2023-06-29
  • 4个隐藏的有用的JavaScript技巧分别是怎样的
    这篇文章将为大家详细讲解有关4个隐藏的有用的JavaScript技巧分别是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。这里有4个关于JavaScri...
    99+
    2024-04-02
  • 57个让C编译器崩溃的代码分别是怎样的
    本篇文章给大家分享的是有关57个让C编译器崩溃的代码分别是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我不清楚你是否很高兴看到你的程序会让编译器崩溃的情况,反正我很喜欢...
    99+
    2023-06-17
  • Java KeyGenerator.generateKey的19个方法分别是怎样的
    Java KeyGenerator.generateKey的19个方法分别是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。小编整理汇总了Java中javax.c...
    99+
    2023-06-22
  • C语言的循环小练习是怎样的
    C语言的循环小练习是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.实现n的阶乘int main(){int n =&nb...
    99+
    2023-06-26
  • 7个JavaScript优秀实践分别是怎样的
    今天就跟大家聊聊有关7个JavaScript优秀实践分别是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 1. 编写构造函数时,在 ...
    99+
    2024-04-02
  • C语言系统调用约定是怎样的
    C语言系统调用约定是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 常见的函数调用约定cdecl,stdcall,fastcall,thiscall,nak...
    99+
    2023-06-21
  • linux系统中的12条性能调优命令分别是怎么样的
    这期内容当中小编将会给大家带来有关linux系统中的12条性能调优命令分别是怎么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。R:运行和等待CPU时间片的进程数。长期大于CPU的个数,代表CPU不足B...
    99+
    2023-06-06
  • C语言是怎样输出唯一的子串
    C语言是怎样输出唯一的子串,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 题目描述给一个字符串,求长度为m的所有不重复的子串。 比如字符串"aaab&q...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作