c语言练习题1(有答案)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、问答题
1.请问以下代码有什么问题:
int main()
{
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
答:stcpy是将“hello”覆盖到str上,str却没有足够的容量,出错:栈溢出改为
int main()
{
char a[10];
char *str=a;
strcpy(str,"hello");
printf("%s",str);
return 0;
}
PS:
1.printf()格式不对
2.虽然运行结果是正确的能够打印:hello , 但是会有栈的错误,因为a是一个char 数据,在这里分配的内存给1一个字节,所以在strcpy会出现内存访问越界
2.int (*s[10])(int) 表示的是什么啊
答:存放返回值和参数都是整型的函数的指针的数组
PS:
函数指针数组
3.
void main()
{
char aa[10];
printf(“%d”,strlen(aa));
}
会出现什么问题?打印结果是是多少?
答:strlen对应的是ld,把d%改为ld%,那么打印结果是0
PS:
打印结果是未知的。
Sizeof 与数组初始化没有关系。
Strlen 跟数组初始化有关系的,打印结果会根据数组中出现‘\0’为止
4.头文件中的ifndef/define/endif 干什么用?
答:防止重定义,也就是防止对已经声明的变量产生冲突
PS:
ifndef _MAIN_H_ // 如果没有定义某个宏
Define //马上就定义这个宏
。。
。。
endif // 结束判断
为了防止头文件被用户多次包
5.程序哪里有错误
wap( int* p1,int* p2 )
{
int * p ;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
答:p指针没有指向一块地址,所以也就不能放p1上的目标,报错:栈溢出,可改为
void wap( int* p1,int* p2 )
{
int c;
int *p=&c;
*p = *p1;
*p1 = *p2;
*p2 = *p;
printf("a=%d,b=%d",*p1,*p2);
}
int main()
{
int a,b;
a=1;
b=2;
printf("a=%d,b=%d\n",a,b);
wap(&a,&b);
return 0;
}
PS:
1.返回值
2.指针p没有初始化,出现了野指针
3.指针p在赋值之前没有分配内存空间,不可以*p= *p1 ;
6.请说明以下const关键字的作用?
Const int * ptr; * ptr被const
int *const ptr; ptr被const
const int Num; Num被const
答:const作用:限定一个变量不允许被改变
PS:
1.表示不能使用ptr来修改ptr所指向的内容
2.表示不能修改ptr所执行的内容(地址)
3.表示不允许修改NUM得值
7.关键字static的作用是什么?
答:首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。
(一)隐藏,对其他源文件不可见。修饰变量(全局变量,局部变量)为内部(静态),修饰函数为内部(静态)
(二)保持变量内容的持久。例如函数(非主函数)内被static修饰的变量a,函数被释放后,变量a不被释放。
(三)默认初始化为0。例如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’
PS:
第一、在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
第二、static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。
第三、static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候自动初始化为0;
(四)
8.简述建立一个TCP连接的几个步骤。(东方拓宇科技有限公司)
答:tcp连接可以说是”三次握手“。一、客户端向服务端请求连接服务端的权限给予连接客户端的权限;二、服务端向客户端发起连接,并给予连接服务端的权限;三、客户端向服务端连接。
PS:(自己理解,三次握手)
连接建立阶段:
第一次握手:客户端的应用进程主动打开,并向客户端发出请求报文段。
第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文
第三次握手:客户端收到确认报文之后,通知上层应用进程连接已建立,并向服务器发出确认报文,当服务器收到客户端的确认报文之后,也通知其上层应用进程连接已建立。