C语言面试题精选:指针、进程、运算、结构体、函数、内存

需积分: 0 2 下载量 41 浏览量 更新于2024-09-13 2 收藏 50KB DOC 举报
"C语言面试题详解" 在C语言面试中,了解基本概念和常见问题是非常重要的。本文将对12个C语言面试题进行详解,涵盖指针、进程、运算、结构体、函数、内存等方面。 **问题1:gets()函数** 问题代码: ```c #include<stdio.h> int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets(buff); printf("\n The buffer entered is [%s]\n",buff); return 0; } ``` 问题描述:请找出上面代码里的问题。 答案:上面代码里的问题在于函数gets()的使用,这个函数从stdin接收一个字符串而不检查它所复制的缓存的容积,这可能会导致缓存溢出。这里推荐使用标准函数fgets()代替。 gets()函数是一种危险的函数,因为它会将输入的字符串复制到缓存中,而不检查缓存的容积,这可能会导致缓存溢出。如果输入的字符串长度超过缓存的容积,gets()函数将继续复制字符串,直到遇到一个换行符或文件结束符,从而导致缓存溢出。 **问题2:strcpy()函数** 问题代码: ```c #include<stdio.h> 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("\nPassword cracked\n"); } else { printf("\nIncorrect passwd\n"); } return 0; } ``` 问题描述:你能在不知道密码的情况下将其破解吗? 答案:破解上述加密的关键在于利用攻破strcpy()函数的漏洞。所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够。所以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。 strcpy()函数也是一个危险的函数,因为它会将源字符串复制到目标缓存中,而不检查目标缓存的容积,这可能会导致缓存溢出。如果源字符串长度超过目标缓存的容积,strcpy()函数将继续复制字符串,直到遇到一个空字符,从而导致缓存溢出。 在C语言编程中,使用gets()和strcpy()函数需要非常小心,因为它们可能会导致缓存溢出和安全漏洞。因此,在编写C语言程序时,需要使用 fgets()和strncpy()函数代替gets()和strcpy()函数,以避免缓存溢出和安全漏洞。