22-11-11学习记录

时间:2022-11-13 14:57:06

1,memcpy:内存拷贝(处理内存不重叠情况)

2,memmove:内存拷贝(处理内存重叠情况)

3,memset:内存设置  void *memset( void *dest, int c, size_t count );

dest:目的地   c:存放的字符  count:操作的字节大小

4,结构体内存对齐规则:

1)第一个成员在与结构体变量偏移量为0的地址处

2)其他成员要对其到对齐数的整数倍地址处

对齐数:编译器默认的一个数与该成员大小的较小值

3)结构体大小为最大对齐数的整数倍

4)如果嵌套了结构体,嵌套的结构体对齐到自己最大对齐数的整数倍初,结构体整体大小为最大对齐数(含嵌套结构体的对齐数)的整数倍


#include<stdio.h>
#include<assert.h>
struct stu
{
char c1;
double c2;
};
int main()
{
struct stu c;
printf("%zd", sizeof(c));
return 0;
}

输出为16

设置对齐数  #pragma pack(4)  {默认对齐数为4)

取消对齐数 #pragma pack()   {()内不填}

#include<stdio.h>
#include<assert.h>
#pragma pack(4)
struct stu
{
char c1;
double c2;
};
#pragma pack()
int main()
{
struct stu c;
printf("%zd", sizeof(c));
return 0;
}

输出为12

5,offsetof:计算结构体成员的偏移量      size_t offsetof( structName, memberName );

#include<stdio.h>
#include<stddef.h>
struct stu
{
char c1;
int i;
double c2;
};
int main()
{
struct stu c;
printf("%zd\n",offsetof(struct stu, c1));
printf("%zd\n",offsetof(struct stu, i));
printf("%zd\n",offsetof(struct stu, c2));
return 0;
}

输出0    4     8