sizeof与strlen用法详解(结构体对齐)
2017-02-21 16:19
357 查看
#include<stdio.h>
int main(int argc,char **argv)
{
unsigned char a[10] ={1,2,1,2,3,4};
unsigned char a1[10] ={0,0,0,0,0,0};
char *p="hello world!";
printf("sizeof(p) =%d\n",sizeof(p));
printf("strlen(p) =%d\n",strlen(p));
printf("sizeof(a) =%d\n",sizeof(a));
printf("sizeof(&a[0]) =%d\n",sizeof(&a[0]));
printf("strlen(a) =%d\n",strlen(a));
printf("sizeof(a1) =%d\n",sizeof(a1));
printf("strlen(a1) =%d\n",strlen(a1));
return 0;
}
上面这个程序如果家能够写出正确结果,我相信不管什么笔试题。考到这类型的都不会错了。分32位系统还是64位系统。
对结构体求长度,链表求长度在这里我稍微讲解一下。
对齐原则
1.普通数据成员对齐规则:第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
2.结构体成员对齐规则:如果一个结构里有某些结构体成员,则该结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
3.结构体大小对齐规则:结构体大小也就是sizeof的结果,必须是其内部成员中最大的对齐参数的整数倍,不足的要补齐。
struct node{
char b;
int a;
short c;
};
上面结构体sizeof(struct node)=16,这是在32位系统中。为什么下面给大家讲解一下。
char b,只是占一个字节,但是int b是4个字节。需要对齐,所以char b也占四个字节,short占两个字节,那是不是应该就是10个字节了,答案是错误的。满足原则三所以字节是12. 看下面这个例子。
struct node{
char b;
int a;
short c;
struct node *next;
};
这个很简单了吧,我电脑是64位系统,struct node *next;是一个地址占8位,前面是10位,但是要满足结构体对齐,所以字节数应该是24位。不懂得继续追问。
如果我们想按一字节对齐或者2字节对齐等,我们可以采取如下措施。
#pragma pack(push) //保存对齐状态
#pragma pack(4)//设定为4字节对齐
#pragma pack(pop)//恢复对齐状态
版权声明:转载请加上原创链接 http://blog.csdn.net/qq_21792169/article/details/52732772。
int main(int argc,char **argv)
{
unsigned char a[10] ={1,2,1,2,3,4};
unsigned char a1[10] ={0,0,0,0,0,0};
char *p="hello world!";
printf("sizeof(p) =%d\n",sizeof(p));
printf("strlen(p) =%d\n",strlen(p));
printf("sizeof(a) =%d\n",sizeof(a));
printf("sizeof(&a[0]) =%d\n",sizeof(&a[0]));
printf("strlen(a) =%d\n",strlen(a));
printf("sizeof(a1) =%d\n",sizeof(a1));
printf("strlen(a1) =%d\n",strlen(a1));
return 0;
}
上面这个程序如果家能够写出正确结果,我相信不管什么笔试题。考到这类型的都不会错了。分32位系统还是64位系统。
对结构体求长度,链表求长度在这里我稍微讲解一下。
对齐原则
1.普通数据成员对齐规则:第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
2.结构体成员对齐规则:如果一个结构里有某些结构体成员,则该结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
3.结构体大小对齐规则:结构体大小也就是sizeof的结果,必须是其内部成员中最大的对齐参数的整数倍,不足的要补齐。
struct node{
char b;
int a;
short c;
};
上面结构体sizeof(struct node)=16,这是在32位系统中。为什么下面给大家讲解一下。
char b,只是占一个字节,但是int b是4个字节。需要对齐,所以char b也占四个字节,short占两个字节,那是不是应该就是10个字节了,答案是错误的。满足原则三所以字节是12. 看下面这个例子。
struct node{
char b;
int a;
short c;
struct node *next;
};
这个很简单了吧,我电脑是64位系统,struct node *next;是一个地址占8位,前面是10位,但是要满足结构体对齐,所以字节数应该是24位。不懂得继续追问。
如果我们想按一字节对齐或者2字节对齐等,我们可以采取如下措施。
#pragma pack(push) //保存对齐状态
#pragma pack(4)//设定为4字节对齐
#pragma pack(pop)//恢复对齐状态
版权声明:转载请加上原创链接 http://blog.csdn.net/qq_21792169/article/details/52732772。
相关文章推荐
- sizeof与strlen用法详解(结构体对齐)
- 全面总结sizeof(字节对齐、数组、类(继承、虚函数)、结构体、strlen)*最全面*
- sizeof,strlen用法详解
- C/C++ 结构体 字节对齐原则详细举例解释 及sizeof的基本用法
- sizeof,strlen用法详解
- 字节对齐 结构体的sizeof
- sizeof(结构体)和内存对齐
- sizeof与strlen的用法
- strlen 和sizeof的用法
- 详解sizeof和strlen
- #pragma pack(n) 对齐用法详解
- sizeof用法与编译器对齐的问题.
- 关于 strlen 和 sizeof 、对齐 2010-01-14 16:35:58
- 关于sizeof与strlen用法的讨论
- sizeof(结构体)和内存对齐
- 基于结构体sizeof的字节对齐问题讨论
- sizeof strlen memset的基本用法
- sizeof()与strlen()用法
- sizeof结构体与内存对齐
- sizeof(结构体)和内存对齐