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 



目录
相关文章
|
4月前
|
C语言
C语言操作符逻辑与,逻辑或面试真题(2)
C语言操作符逻辑与,逻辑或面试真题(2)
|
1月前
|
存储 C语言
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
|
2月前
|
算法 编译器 C语言
C语言面试考点之二
C语言面试考点之二
13 0
|
2月前
|
C语言
腾讯面试真题(C语言)
腾讯面试真题(C语言)
|
6月前
|
编译器 C语言 C++
带你刷笔试关的小怪|详解指针习题和面试题【C语言/指针/进阶】
带你刷笔试关的小怪|详解指针习题和面试题【C语言/指针/进阶】
38 0
|
9月前
|
存储 编译器 Linux
【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!
【C语言高阶篇】C语言面试必考知识点,结构体的内存对齐我看还有谁不会!
107 0
|
9月前
|
存储 C语言
(C语言版)力扣(LeetCode)栈和队列面试题
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
|
9月前
|
算法 C语言 C++
(C语言版)力扣(LeetCode)+牛客网(nowcoder)链表相关面试题OJ题解析(下)
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
|
9月前
|
算法
(C语言版)力扣(LeetCode)+牛客网(nowcoder)链表相关面试题OJ题解析(上)
递归的写法看起来简洁,实际并没有迭代写法好理解,而且在空间复杂度上也比迭代高,这里的递归写法思路主要是先向下找到尾结点后,向上逐个返回,如果等于val值,就将该节点上一个元素直接指向该节点下一个元素,等于是将该点从链表中删除了
(C语言版)力扣(LeetCode)+牛客网(nowcoder)链表相关面试题OJ题解析(上)
|
9月前
|
存储
(C语言版)力扣(LeetCode)数组相关面试题OJ题解析(下)
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。