C++/C中常见小问题总结
2016-12-07 16:45
176 查看
sizeof问题
函数参数传递数组的退化问题
注意sizeof是一个运算符,而不是一个函数。所以一般情况下数组传递给函数,都是要退化成指针的。所以下面这个void fun(char str_arg[100]) { printf("%d\n", sizeof(str_arg)); }
输出4(32位)或者8(64位);作为函数参数传递,以下写法均等价:
fun(char [8]) fun(char []) fun(char *)
###sizeof和strlen的区别###
char a[] = "1234"; char b[10] = "12345"; cout << sizeof(a) << " " << strlen(a) << endl; //输出5 4 cout << sizeof(b) << " " << strlen(b) << endl; //输出10 5
因为strlen只能传入char* ,它是从头开始找直到找到’\0’为止,其只返回数组自己的长度,而sizeof计算的是开辟这块内存空间的大小。
类对象的sizeof大小
有两个需要注意的地方,一个是虚函数的虚函数表占4字节,还有一个是对其问题对齐问题,在我的另外一个文章中已经说过了C++11中枚举enum和union,顺带说一下内存对齐和大小端问题还有个小细节
柔性数组
struct A{ }; cout<<sizeof(A); //输出1,虽然类里面没有任何东西,但是它还是会占个地方(?)这个地方解释存疑 struct B{ int t; int a[0]; }; cout<<sizeof(B); //输出4
长度为0的数组,这样只能在结构体/类中定义,如果再函数中定义会报错,其不占内存空间。这种数组叫柔性数组
结构体最后使用0或1的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直接使用指针而不使用数组,那么,你在分配内存缓冲区时,就必须分配结构体一次,然后再分配结构体内的指针一次,(而此时分配的内存已经与结构体的内存不连续了,所以要分别管理即申请和释放)而如果使用数组,那么只需要一次就可以全部分配出来,(见下面的例子),反过来,释放时也是一样,使用数组,一次释放,使用指针,得先释放结构体内的指针,再释放结构体。还不能颠倒次序。
其实就是分配一段连续的的内存,减少内存的碎片化。
函数传指针问题再探
相关文章推荐
- Php部分常见问题总结
- Php部分常见问题总结
- 开发与测试常见问题总结与建议
- 【转】SQL SERVER中一些常见性能问题的总结
- VC常见入门问题总结(三)
- 针对上午的"asp.net最常见的错误总结"的问题的解决方法!
- Php部分常见问题总结第1/2页
- [转]SQL SERVER中一些常见性能问题的总结
- [原创]Loadruner常见问题解决总结
- VC常见入门问题总结(一)
- SQL SERVER中一些常见性能问题的总结[转]
- SQL SERVER中一些常见性能问题的总结
- JfreeChart使用经验总结(分析了使用中碰到的一些常见问题)
- Php部分常见问题总结
- SQL SERVER中一些常见性能问题的总结(转载)
- Php部分常见问题总结
- PHP session常见问题集锦及解决办法总结
- SQL SERVER中一些常见性能问题的总结(转载)
- SQL SERVER中一些常见性能问题的总结
- VC常见入门问题总结(二)