12个关于C语言的有趣问答
本文导语: 本文汇总了12个关于C语言的问答,对于加深对C语言程序设计的难点理解很有帮助,读者可参考一下: 1、gets() 方法 问:以下代码有个被隐藏住的问题,你能找到它吗? 答:这个不显眼的问题就是使用了 gets() 方法。此方法接...
本文汇总了12个关于C语言的问答,对于加深对C语言程序设计的难点理解很有帮助,读者可参考一下:
1、gets() 方法
问:以下代码有个被隐藏住的问题,你能找到它吗?
答:这个不显眼的问题就是使用了 gets() 方法。此方法接受一个string类型参数,但是却没有检测此数值是否 有足够的空间来拷贝数据。所以这里我们一般用 fgets() 方法将来的更好。
#include
int main(void)
{
char buff[10];
memset(buff,0,sizeof(buff));
gets(buff);
printf("n The buffer entered is [%s]n",buff);
return 0;
}
2、strcpy() 方法
问:密码防护是很基本的功能,看看能否搞定下面这段代码?
#include
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("n Password cracked n");
}
else
{
printf("n Incorrect passwd n");
}
return 0;
}
3、main() 方法的返回类型
问:请问下面这段代码能否通过编译?如果能的话,那么这段代码中隐含什么问题吗?
#include
void main(void)
{
char *ptr = (char*)malloc(10);
if(NULL == ptr)
{
printf("n Malloc failed n");
return;
}
else
{
// Do some processing
free(ptr);
}
return;
}
答:答案是代码能通过编译,但是会留下针对main()方法的返回类型的警告。main()方法的真正返回类型应该为'int'而非'void'。这是因为'int'返回类型能够让程序返回状态值。尤其是当这段程序作为其他应用的附属程序时这个状态值将更加重要。
4、内存泄露
问:请问以下代码有内存泄露吗?
#include
void main(void)
{
char *ptr = (char*)malloc(10);
if(NULL == ptr)
{
printf("n Malloc failed n");
return;
}
else
{
// Do some processing
}
return;
}
答:好,虽然上面的代码没有对指针 ptr 进行内存释放,但实际上即使是程序结束也不会造成内存泄露,因为当程序结束时所有一开始被占据的内存就全部清空了。但如果上面这段代码是在 while 循环里面那将会造成严重的问题
补充: 如果你需要了解更多关于内存泄露的问题,你可以参考这篇文章http://www./article/41216.htm
5、free() 方法
问:以下代码当用户输入'freeze'时会奔溃,而如果输入'zebra'则运行正常,这是为什么?
#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(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;
}
答:问题的根源是因为代码在while循环中改变了 ptr 指针的地址。当输入为'zebra'时,while循环甚至在执行 第一遍前就结束了,所以free()释放的内存地址就是一开始malloc()分配的地址。但是当输入'freeze'时, ptr记录的地址在while循环中被更改,因为将会是错误的地址传递到free()方法中引起崩溃。
6、atexit with _exit
问:在以下代码,atexit()方法并没有被调用,你知道为什么吗?
#include
void func(void)
{
printf("n Cleanup function called n");
return;
}
int main(void)
{
int i = 0;
atexit(func);
for(;i您可能感兴趣的文章:
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。