[参考来源: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
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
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语言里函数的参数默认是从右往左处理的,输出时是从左往右。