C语言面试题收集

参考:

  1. C语言十二道有趣的面试题(1)
  2. C语言十二道有趣的面试题(2)
  3. exit()和_exit()的区别
  4. C语言泛型链表的实现、Linux内核中的链表实现
  5. strcpy、strncpy、strcpy_s的比较
  6. C语言函数参数处理顺序
  7. C语言高级程序设计

问题摘录:

  • free函数的操作参数必须是申请同一片内存空间时malloc返回的起始地址,否则出错。问题和实例代码如下:下面的程序会在用户输入'freeze'的时候出问题,而'zebra'则不会,为什么?
#include <stdio.h>
#include <stdlib.h>
#include <string.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(dest,source,num):dest指向目标缓存、source指向源缓存、
// num为要拷贝的字节数,如果num超过dest的空间,则报错
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;
} 

- _exit()、exit()、atexit()函数的区别:
_exit():直接进入内核,属于POSIX标准
exit(): ANSI C标准。先做一些清理工作,例如关闭打开的文件,将缓存区的数据写回到文件中,最后再调用_exit()。
atexit():C语言可以利用atexit(func)注册函数func,作为在main函数结束之后的一些操作,其中func为void类型。
在下面这段代码中,func并没有被调用,就是因为这里用的是_exit()。

#include<stdio.h>

void func(void)
{
printf("\n Cleanup function called \n");
return;
}

int main(void)
{
int i = 0;

atexit(func);

for(;i
  • 在《C语言十二题part1》中,第二题的答案,想法挺好,但是实际运行的时候,并没有他说的那种效果。代码如下:当输入超过10个字符的时候,编译器会检查出错误~
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char argv[])
{
int flag = 0;
char passwd[10];

// memset(dest,c,sizeof(dest)):将dest指向的缓存全部置为c
memset(passwd,0,sizeof(passwd));

//char p = (char*)malloc(10);
//strcpy(passwd, argv[1]);
scanf("%s",passwd);

if(0 == strcmp("LinuxGeek", passwd))
{
flag = 1;
}

if(flag)
{
printf("\n Password cracked \n");
}
else
{
printf("\n Incorrect passwd \n");

}
return 0;
} 
  • *和++的优先级一样, 前置++和后置++的不同
#include<stdio.h>

int main(void)
{
char ptr = "Linux";
printf("\n [%c] \n",ptr++);
//printf("\n [%c] \n",++ptr);
printf("\n [%c] \n",ptr);

return 0;
} 
  • 常量字符串不能修改,C风格字符串的知识点
#include<stdio.h>

int main(void)
{
char ptr = "Linux";
 ptr = 'T'; // 错误,此处ptr指向的是常量字符串,它的值是常量字符串的首字符的地址,即L的地址,而这句话试图修改L为T,发生错误

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

return 0;
} 
  • 能够修改自己名字的进程,哈哈,有点意思,修改argv[0]即可。
#include<stdio.h>

int main(int argc, char *argv[])
{
int i = 0;
char buff[100];

memset(buff,0,sizeof(buff)); // 初始化buff

strncpy(buff, argv[0], sizeof(buff)); //将原来的进程名拷贝到buff中
memset(argv[0],0,strlen(buff)); // 将argv[0]置为0

strncpy(argv[0], "NewName", 7); //将新名字拷贝进argv[0]中

// Simulate a wait. Check the process
// name at this point.
for(;i
  • 变量的生存周期和函数的值传递性质
#include<stdio.h>

int inc(int val)
{
int a = val;
a++;
return &a;
//严重漏洞,不可返回本地变量a的地址,因为a的生命周期仅仅是在inc这个函数中
}

int main(void)
{
int a = 10;
int val = inc(a);
printf("\n Incremented value is equal to [%d] \n", *val);

return 0;
} 
  • printf()函数的参数是从右往左处理,因为参数一般为从右往左压栈的,这是因为C语言为了支持可变参数而确立的一个特性!
    #include<stdio.h> 

int main(void)
{
int a = 10, b = 20, c = 30;
printf("\n %d..%d..%d \n", a+b+c, (b = b2), (c = c2));

return 0; 

}

输出结果如下:

110..40..60 
时间: 2024-07-28 17:10:01

C语言面试题收集的相关文章

Linux下C编程:华为C语言面试题之Variable

华为C语言面试题: 程序的局部变量存在于(堆栈)中,全局变量存 在于(静态区 )中,动态申请数据存在于( 堆)中. 一点小总结: 1.关于堆栈,印象最深的就是在做uboot移植,在你准备进入c代码时 ,你必须给c代码一个良好的运行环境,其中重要的一项就是设置堆栈. 2.关于静态内存分配和动态内存分配的区别及过程 1) 静态内存 分配是在编译时完成的,不需要占用CPU资源:动态分配内存是在运行时完成的 ,动态内存的分配与释放需要占用CPU资源: 2) 静态内存分配是在栈上 分配的,动态内存是堆上分

Linux下C编程:华为C语言面试题之extern

华为C语言面试题 如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错                       3. 此外,extern修饰符可用于指示C或者C++函数的调用规范.比如在C++中调用C库函数,就需要在C++程序中用extern "

编程c语言-c语言操作试题 答案看不懂

问题描述 c语言操作试题 答案看不懂 规定输入的字符串中只包含字母和*号.编写函数fun,其功能是:除了字符串前导和尾部的*号外,将串中其他的*号全部删除.形参h已指向字符串中第一个字母,形参P指向字符串中最后一个字母.在编写函数时,不得使用C语言提供的字符串函数. 例如,若字符串中的内容为"****A*BC*DEF*G*******",删除后,字符串中的内容应当是"*****ABCDEFG********". 注意:部分源程序给出如下. 请勿改动主函数main和其

12个有趣的C语言面试题及答案

转自:http://www.codeceo.com/article/12-interesting-c-programs.html 12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出下面代码里的问题: #include<stdio.h> int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets(buff); printf("\n The buffer

数据库之Oracle笔试面试题收集(来自网络)

数据库之Oracle笔试面试题收集(来自网络) 问题: 1.解释冷备份和热备份的不同点及各自的优点? 2.解释归档和非归档模式之间的不同和它们各自的优缺点? ***************************************************************************************************************************************************************************

asp.net面试题收集

asp.net 1.new有几种用法 第一种:new Class(); 第二种:覆盖方法 public new XXXX(){} 第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数. 2.如何把一个array复制到arrayList里 foreach( object o in array )arrayList.Add(o); 3.datagrid.datasouse可以连接什么数据源 [dataset,datatable,dataview] dataset,datat

语言 面试题-一道面试题,不是很清楚这个例子怎么解答,求大神帮助.

问题描述 一道面试题,不是很清楚这个例子怎么解答,求大神帮助. 提问是 这段代码有什么问题, 有什么解决思路.(我其实连问题都没看出来,代码可以编译) // Memory-mapped peripheral#define STATUS_REG_ADDR 0x12345678 // 32-bit status register#define DATA_REG_ADDR 0x1234567C // 32-bit data register // Status register bits#define

12个有趣的C语言面试题

1.gets()函数 问:请找出下面代码里的问题: #include<stdio.h>&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;int main(void) {     char buff[10];     memset(buff,0,sizeof(buff));      gets(buff);      printf("n The buffer entered is [%s]n&qu

C/C++语言笔试题

第一部分:基本概念及其它问答题 1.   关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量. 3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用.