当前位置:  编程技术>c/c++/嵌入式

12个关于C语言的有趣问答

    来源: 互联网  发布时间:2014-10-26

    本文导语:  本文汇总了12个关于C语言的问答,对于加深对C语言程序设计的难点理解很有帮助,读者可参考一下: 1、gets() 方法 问:以下代码有个被隐藏住的问题,你能找到它吗? 答:这个不显眼的问题就是使用了 gets() 方法。此方法接...

本文汇总了12个关于C语言的问答,对于加深对C语言程序设计的难点理解很有帮助,读者可参考一下:

1、gets() 方法

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

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

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

2、strcpy() 方法

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

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

3、main() 方法的返回类型

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

#include
 
void main(void)
{
  char *ptr = (char*)malloc(10);
 
  if(NULL == ptr)
  {
    printf("n Malloc failed n");
    return;
  }
  else
  {
    // Do some processing
 
    free(ptr);
  }
 
  return;
}

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

4、内存泄露

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

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

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

补充: 如果你需要了解更多关于内存泄露的问题,你可以参考这篇文章http://www./article/41216.htm

5、free() 方法

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

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

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

6、atexit with _exit

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

#include
 
void func(void)
{
  printf("n Cleanup function called n");
  return;
}
 
int main(void)
{
  int i = 0;
 
  atexit(func);
 
  for(;i

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 2013年7月和2013年8月编程语言排行榜
  • 如何在GTK2.0下实现国际化(语言选择根据自己设置的语言,不用系统的语言)
  • 2017 年热门编程语言排行榜出炉,你的语言上榜没?
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • 苹果OS X和IOS下最新编程语言swift介绍
  • 求助,在linux下,c语言和汇编语言的接口是什么?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • C语言中间语言 CIL iis7站长之家
  • PHP编程语言介绍及安装测试方法
  • 最近学JSP,苦于HTML语言和JAVA语言太差,请教推荐几本书,thanks.
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)
  • 动态编程语言 LIME编程语言
  • c语言实现MD5算法完整代码示例
  • C语言如何改变当前语言环境
  • 以NetBeans IDE为例介绍如何使用XML中Schema语言
  • 如何在VIM中使汇编语言和C语言自动缩进?
  • c语言基于libpcap实现一个抓包程序过程
  • 我安装的linux时默认语言选择的是中文,又乱码,怎么可以解决?怎么更改默认语言成英文?
  • HTML超文本标记语言教程及实例
  • Redhat9安装时语言只选择了中文,现在还能再增加其它语言的支持吗?如英文
  • MD5算法的C语言实现
  • 请问哪里有ubuntu 9.0版本的中文语言包和KDE的中文语言包下载,我用Google搜索了很多地方都没有!




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3