C语言基础(不断更新)
1.memcpy、 memmove、memccpy的区别
memcpy要求源串和目的串不能重叠
memccpy:copy直至遇到由参数指定的ch.
memmove: 源串和目的串可以重叠。
2.strcpy写法
【转载】面试常考题型之strcpy写法
- 注意检查指针有效性,注:’\0’与NULL一样,是acii码为0的字符,都怪自己以前看别人的代码不求甚解,还妄加评论,到现在才弄清楚这一点,检查字符串的有效性不是用strlen(str)==0来进行的。
- 注意抛出异常,如果指针无效,抛出异常,throw “invalid pointer”;注意这种throw的方式是c++风格,在c中实现异常处理还需颇费周折
- 注意封口,也就是注意dest的最后一个字符串为’\0’
- 注意返回值,以实现链式效果
3.strlen的一些考虑
strlen(NULL)和strlen(“”)有何区别?
作为一个习惯了写c++代码的人,一直很依赖语言提供相应的边界检查,认为理所当然strlen里面会有对字符串为null这种特殊情形的检查,但是发现,其实c语言好多函数都需要注意调用条件,这是一个典型的例子,strlen(NULL);在编译的时候没问题,但是执行期就出错了。而strlen(“”);返回值为0,这是理所当然的。
4.关于sizeof的碎碎念
sizeof使用有两种形式:
- sizeof(变量类型):必须加括号
- sizeof(变量)or sizeof 变量,如sizeof int
几种特殊的考虑:
- sizeof(函数名):gcc返回1,听说vc不支持
- sizeof(void):gcc返回1,听说vc不支持
- sizeof(结构类型):需考虑对齐
- sizeof(string)的值一定是固定的,在普通机器上为4,这就是我在下一条中总结的。关于sizeof(string),今天看那本面试宝典的时候看到这个表达式,有点吃惊,书上写着sizeof(string)=4;当时很纳闷,难道分配4个字节大小的内存给string吗?查阅了相关资料得出结论:string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。
- sizeof(数组名):值为所有数组元素大小的和,见我另一篇数组名总结
注意:
- sizeof 不是函数,可能是个宏
- sizeof获取的是在栈上需要的空间,堆上申请的空间跟sizeof无关。
- sizeof是在编译器处理的,所以被sizeof的表达式是不会计算的,如下面输出是4,0,而不是4,3
nt a = 0;cout<<sizeof(a=3)<<endl;
cout<<a<<endl;- sizeof最强总结
4.string 类型的大小
好吧,这其实是一个c++问题,但是姑且先放入这个专题,请问下面这个程序结果为多少?
#include <string>
#include <iostream>
typedef struct AA{std::string a;int *pb;
}A;using namespace std;int main()
{cout<<sizeof(A);
return 0;
}