- 相干保举
C说话的风趣问答12个
本文是百分网小编搜刮清算的对于对C说话的风趣问答12个,有助于读者加深对C说话法式设想的懂得,有须要的伴侣们一路看看吧!想领会更多相干信息请延续存眷咱们应届毕业生测验网!
1、gets() 方式
问:以下代码有个被埋没住的题目,你能找到它吗?
答:这个不背眼的题目便是利用了 gets() 方式。此方式接管一个string范例参数,可是却不检测此数值是不是 有充足的空间来拷贝数据。以是这里咱们普通用 fgets() 方式未来的更好。
#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;
}
2、strcpy() 方式
问:暗码防护是很根基的功效,看看可否搞定下面这段代码?
#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("\n Password cracked \n");
}
else
{
printf("\n Incorrect passwd \n");
}
return 0;
}
3、main() 方式的前往范例
问:叨教下面这段代码可否经由过程编译?若是能的话,那末这段代码中隐含甚么题目吗?
#include<stdio.h>
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<stdio.h>
void main(void)
{
char *ptr = (char*)malloc(10);
if(NULL == ptr)
{
printf("\n Malloc failed \n");
return;
}
else
{
// Do some processing
}
return;
}
答:好,固然下面的代码不对指针 ptr 停止内存开释,但现实上即便是法式竣事也不会形成内存泄漏,由于当法式竣事时一切一起头被占有的内存就全数清空了。但若是下面这段代码是在 while 轮回外面那将会形成严峻的题目
补充: 若是你须要领会更多对于内存泄漏的题目,你能够参考这篇文章//www.jb51.net/article/41216.htm
5、free() 方式
问:以下代码当用户输入'freeze'时会奔溃,而若是输入'zebra'则运转一般,这是为甚么?
#include<stdio.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(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<stdio.h>
void func(void)
{
printf("\n Cleanup function called \n");
return;
}
int main(void)
{
int i = 0;
atexit(func);
for(;i<0xffffff;i++);
_exit(0);
}
答:这是由于利用了 _exit() 方式。此方式并不挪用断根数据相干的方式,比方 atexit()等。
7、void* 与 C 布局体
问:可否设想一个方式接管肆意范例的参数而后前往整数?同时是不是有方式通报多个如许的参数?
A:一个能接管肆意范例参数的方式像下面这个模样:
int func(void *ptr)
若是须要通报多个参数,那末咱们能够通报一个包罗这些参数的布局体
8、* 与 ++ 操纵符
问:以下代码将输入甚么?为甚么?
#include<stdio.h>
int main(void)
{
char *ptr = "Linux";
printf("\n [%c] \n",*ptr++);
printf("\n [%c] \n",*ptr);
return 0;
}
答:以上的输入将是:
由于++与 * 的优先级一样,以是 *ptr++ 将会从右向左操纵。根据这个逻辑,ptr++ 会先履行而后履行*ptr。以是第一个成果是'L'。也由于 ++ 被履行了,以是下一个printf() 成果是'i'。
9、Making changes in Code segment
问:以下代码运转时必然会瓦解,你能说出缘由吗?
#include<stdio.h>
int main(void)
{
char *ptr = "Linux";
*ptr = 'T';
printf("\n [%s] \n", ptr);
return 0;
}
答:这是由于,经由过程 *ptr = ‘T',此行代码测验测验变动只读内存存储的字符串'Linux'。此操纵固然行不通以是才会形成瓦解。
10、Process that changes its own name
问:你可否写一个法式在它运转时点窜它的称号?
答:以下代码能够完成
#include<stdio.h>
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;
}
11、部分变量的前往地点
问:下面的代码有题目吗?若是有,若何点窜?
#include<stdio.h>
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()方式履行后,再次利用部分变量的地点就会形成不可估计的成果。处置之道便是通报变量a的地点给main()。
12、处置 printf() 参数
问:以下代码输入叨教是甚么?
#include<stdio.h>
int main(void)
{
int a = 10, b = 20, c = 30;
printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2));
return 0;
}
答:输入将是
110..40..60
这是由于参数都是从右向左处置的,而后打印出来倒是从左向右。
【C说话的风趣问答12个】相干文章:
风趣的C说话预处置07-29
风趣的C说话口试题08-03
C说话进修中常见的12个小问答09-07
C说话和C++的别离06-18
C说话和C++的区分09-19
C说话的利用05-29
C说话的指针10-11
C说话试题11-01
C说话for轮回11-05
C说话运算06-09