C语言问题集锦

[参考来源:http://www.csdn.net/article/2012-09-06/2809604-12-c-interview-questions]

1、gets()函数:
函数gets()从stdin接收一个字符串而不检查它所复制的缓存的容积,这可能会导致缓存溢出,推荐使用标准函数fgets()代替。

2、换行:
window操作系统下的换行为'\r\n',linux和unix操作系统下为'\n'

3、strcpy()函数:
使用strcpy()的时候一定要检查接收变量的容量是否足够,推荐使用strncpy()或memcpy()。

4、main()函数返回值:
main()的返回类型应该是“int”而不是“void”,因为“int”返回类型会让程序返回状态值。这点非常重要,特别当程序是作为依赖于程序成功运行的脚本的一部分运行时。

5、内存泄露:
在程序模块中动态申请内存时,用完的时候必须马上释放,虽然改程序结束时会自动释放,但如果申请内存是在while语句中,则会造成严重的内存泄露。

6、free出错:
指针的值在程序中被修改,导致传给free()的地址出错,也就导致了seg-fault或者崩溃。

7、atexit()函数:
如果使用atexit()就应当使用exit()或者“return”与之相配合,而不应该用_exit()函数

8、能接受任何类型的参数并返回interger(整数)结果的函数:
int func(void *ptr)

9、运算符:
“++”和“*”的优先权一样,所以“*ptr++”相当于“*(ptr++)”。即应该先执行ptr++,然后才是*ptr

10、排错:
char *ptr = "Linux";   *ptr = 'T';
通过*ptr = ‘T’,会改变内存中代码段(只读代码)“Linux”的第一个字母。这个操作是无效的,因此会造成seg-fault或者崩溃。

11、会改变自己名字的进程:
#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;                            
}                                       

12、返回本地变量的地址:
#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;                                               
}                                                            
尽管上面的程序有时候能够正常运行,但是在“inc()”中存在严重的漏洞。这个函数返回本地变量的地址。因为本地变量的生命周期就是“inc()”的生命周期,所以在inc结束后,使用本地变量会发生不好的结果。这可以通过将main()中变量“a”的地址来避免,这样以后还可以修改这个地址存储的值。
printf函数:

 

13、C语言里函数的参数默认是从右往左处理的,输出时是从左往右。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值