博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言面试题收集
阅读量:5737 次
发布时间:2019-06-18

本文共 2809 字,大约阅读时间需要 9 分钟。

参考:

问题摘录:

  • free函数的操作参数必须是申请同一片内存空间时malloc返回的起始地址,否则出错。问题和实例代码如下:下面的程序会在用户输入'freeze'的时候出问题,而'zebra'则不会,为什么?
#include 
#include
#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(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
void func(void) {
printf("\n Cleanup function called \n"); return; } int main(void) {
int i = 0; atexit(func); for(;i
  • 在《C语言十二题part1》中,第二题的答案,想法挺好,但是实际运行的时候,并没有他说的那种效果。代码如下:当输入超过10个字符的时候,编译器会检查出错误~
#include 
#include
#include
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
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
int main(void) {
char ptr = "Linux"; ptr = 'T'; // 错误,此处ptr指向的是常量字符串,它的值是常量字符串的首字符的地址,即L的地址,而这句话试图修改L为T,发生错误 printf("\n [%s] \n", ptr); return 0; }
  • 能够修改自己名字的进程,哈哈,有点意思,修改argv[0]即可。
#include
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
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

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

转载地址:http://jhwzx.baihongyu.com/

你可能感兴趣的文章
刨根问底--技术--jsoup登陆网站
查看>>
OSChina 五一劳动节乱弹 ——女孩子晚上不要出门,发生了这样的事情
查看>>
Spring--通过注解来配置bean
查看>>
pandas 十分钟入门
查看>>
nginx rewrite
查看>>
前端安全系列(一):如何防止XSS攻击?
查看>>
IK分词器安装
查看>>
查看Linux并发连接数
查看>>
你是谁不重要,关键是你跟谁!
查看>>
CSS中规则@media的用法
查看>>
pychecker:分析你的python代码
查看>>
css 默认不显示 之后显示
查看>>
我的友情链接
查看>>
DNS显性+隐性URL转发原理
查看>>
我的友情链接
查看>>
网易有道 IP地址、手机号码归属地和身份证 查询接口API
查看>>
鼠标停留在GridView某一行时行的颜色改变
查看>>
系列3:WAS Liberty Profile hello mysql jdbc
查看>>
基础知识:python模块的导入
查看>>
Android MVC之我的实现
查看>>