您的位置:首页 > 编程语言 > C语言/C++

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的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直接使用指针而不使用数组,那么,你在分配内存缓冲区时,就必须分配结构体一次,然后再分配结构体内的指针一次,(而此时分配的内存已经与结构体的内存不连续了,所以要分别管理即申请和释放)而如果使用数组,那么只需要一次就可以全部分配出来,(见下面的例子),反过来,释放时也是一样,使用数组,一次释放,使用指针,得先释放结构体内的指针,再释放结构体。还不能颠倒次序。

其实就是分配一段连续的的内存,减少内存的碎片化。

函数传指针问题再探

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 C++