本文章是我实际参加笔试后做错或则不会做的题目,做做总结:
1、编写一个自己的strcpy函数
(1)需考虑内存重叠问题。
(2)为什么可以从src复制到dst,还要在函数最后返回目标指针。
char *kcan_strcpy(char *dst,const char *src){
int src_size = sizeof(src) + 1;
char *ret = dst;
if(dst > src + src_size ||<span style="white-space:pre"> </span>// 内存木有重叠 正向拷贝
dst < src - src_size
){
while(src_size--)
*dst++ = *src++;
}else{<span style="white-space:pre"> </span>// 内存重叠 逆向拷贝
while(src_size--){
*(dst + src_size) = *(src + src_size);
}
}
return ret;
}
2、const和volatile可不可以同时使用,比如const volatile int val;
答案是可以~
表面上看过去他们是反义词,目测是不能同时使用的,好像互相矛盾,但是实际上
可以同时使用,const修饰一个东东时是告诉编译器他不能被程序员人为的通过修饰
的本身修改,但是实际上我们可以通过他的地址来改变他的值或则赋值给别的变量
来修改他。如下:
const int a = 1;
int *b = &a;
*b = 2;
// 这个时候a是2
用volatile修饰是告诉编译器不要去优化它,不要从缓存中去取值,必须每次从内存中
去读取。通常用来修饰外部采集的数据。
其实我还是不大能理解const和volatile同时修饰一个值有什么意义!!(望知道的大神
解答一二)。笔试的时候答上面两点应该可以吧~~
3、还是关于volatile的。
下面这段代码有什么错误?
int squre(volatile int *ptr){
return *ptr * *ptr;
}
这个函数是用来返回输入参数的平方的,但是如果用volatile修饰可能无法返回他们的平
方,比如输入参数是实时采集的。而该函数经过编译器后会编程一下形式。
int squre(volatile int *ptr){
int a = *ptr;
int b = *ptr;
return a*b;
}
所以每次去内存中读取的时候可能读取到的值是不一样的,所以返回的便不是平方了。
可以这样解决:
int squre(volatile int *pte){
int a = *ptr;
return a*a;
}
4、#error在预编译时有什么作用
我之前并没有用过这个鬼,所以就随便说了。
正解是:当预处理器处理到#error时将停止编译输出用户自定义的错误信息。用法是:
#error 在这里停止编译了
当编译器编译到该处时便会停止编译··
待续···