A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Mr.Qing 中级黑马   /  2014-9-15 23:40  /  1459 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家都知道 如果在构造类型里同时定义不同的数据类型 肯定是以长度最大的数据类型的字节长度作为模 比如说
#include <stdio.h>
struct p
{
int a;
char b;
float c;
};

int main(int argc, const char * argv[]) {

    int b;
    b= sizeof(struct p);
    printf("%d\n",b);
    return 0;
}
这时肯定是以4为模输出结果应该是8。这里大家应该都没有问题 但是如果加上指针呢
#include <stdio.h>
struct p
{
//    int a;//4
//    double b;//8
//    int c;//4
//    char d;//1
    char *p;//8
    int a;
//    char *p2;
//    char a1[16];
//    char a2[16];//33 4个8 生1个===数组里边有5个8
};

int main(int argc, const char * argv[]) {

    int b;
    b= sizeof(struct p);
    printf("%d\n",b);
    return 0;
}
那么这时就应该是以 指针的长度8为模来计算了输出结果应该是16;那我们之前知道这个规则只适用于一般数据类型 今天我们找的规律应该是复杂类型的 下面我们加上数组在试验一下会出现什么结果呢
#include <stdio.h>
struct p
{
//    int a;//4
//    double b;//8
//    int c;//4
//    char d;//1
    char *p;//8
//    int a;
    char *p2;
    char a1[16];
    char a2[17];//33 4个8 剩1个===数组里边有5个8
};

int main(int argc, const char * argv[]) {

    int b;
    b= sizeof(struct p);
    printf("%d\n",b);
    return 0;
}
这时候又应该怎么来计算里边的长度呢 经过多次的试验 我发现如果加上数组来算的话 应该是依旧按照最大的数据类型为模计算 不过每个元素占一个字节来算 以上面的代码为例两个char类型指针应该是8+8那么底下又 定义了两个两个char类型数组长度分别为16、17那么一共是33  也就相当于4个8余1 也就是划给这两个数组4个8个字节长度的存储区域不够放 所以要新开一个 也就是说这两个char类型数组占5个8大小的内存 那么为什么新开的长度是8呢是因为数组是没有办法规定模的大小的只好用剩下的数据类型大小来划分模的大小  挑剩下的数据类型中最大的作为模也就是挑char指针的长度为模 则是8 所以上面的代码输出结果为56 也就是两个char指针的8+8 再加上数组所占用的5个8 也就是一共7个8 也就是56

4 个回复

倒序浏览
插入代码模式,这样没人看没用的
回复 使用道具 举报
怎么插入代码?
回复 使用道具 举报
学习了!!
回复 使用道具 举报
就是内存对齐要求嘛。模是啥玩意儿?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马