• C语言编程题(五)sizeof结构体与字节对齐


    1. struct A
    2. {
    3. long num;
    4. char *name;
    5. short int data;
    6. char ha;
    7. short ba[5];
    8. } *p;
    9. int main()
    10. {
    11. printf("结构体A的大小:%d\n", sizeof(struct A));
    12. printf("num的大小:%d\n", sizeof(((struct A *)0)->num));
    13. printf("name的大小:%d\n", sizeof(((struct A *)0)->name));
    14. printf("data的大小:%d\n", sizeof(((struct A *)0)->data));
    15. printf("ha大小:%d\n", sizeof(((struct A *)0)->ha));
    16. printf("ba的大小:%d\n", sizeof(((struct A *)0)->ba));
    17. return 0;
    18. }

    在32位机器上,在对齐为4情况下,sizeof(long)的结果为4字节,sizeof(char*)的结果为4字节,sizeof(short int)的结果与sizeof(short)的结果都为2字节,sizeof(char)的结果为1字节,sizeof(int)的结果为4字节

    1. struct B
    2. {
    3. float num;
    4. double b;
    5. char *name;
    6. char c;
    7. int data;
    8. } *D;

    结果为32:(4+4+8+4+1+3+4+4)橙色字体为填充的

    strlen("\0")与sizeof("\0")

    strlen("\0") = 0sizeof("\0") = 2

    strlen
    strlen用来计算字符串的长度,它从内存的某个位置开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值

    1. #include
    2. int main()
    3. {
    4. char arr1[] = {'a', 'b', 'c', 'd', 'e', 'f'};
    5. char arr2[] = {'a', 'b', 'c', 'd', 'e', 'f', '\0'};
    6. char arr3[] = {'a', 'b', 'c', '\0', 'e', 'f', '\0'};
    7. printf("%d\n", strlen(arr1)); // 答案为7,视编译器而定
    8. printf("%d\n", strlen(arr2)); // 答案为6
    9. printf("%d\n", strlen(arr3)); // 答案为3
    10. printf("%d\n", strlen("abc\0def")); // 答案为3
    11. printf("%d\n", sizeof(arr1)); // 答案为6
    12. printf("%d\n", sizeof("abcdef")); // 答案为7
    13. printf("%d\n", sizeof(arr2)); // 答案为7
    14. printf("%d\n", sizeof(arr3)); // 答案为7
    15. printf("%d\n", sizeof("abc\0def")); // 答案为8
    16. return 0;
    17. }

    sizeof
    sizeof是C语言的关键字,它以字节的形式给出了其操作数的存储大小,操作数可以是一个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定

    sizeof("\0") = 2,这是因为在C/C++中,字符串字面量(以双引号括起来的字符序列)包括其实际字符内容和一个null终止符('\0')作为字符串的结束标志。因此,字符串 "\0" 实际上包含两个字符:一个是null终止符,另一个是实际的字符。

    1. void func0(){
    2. char array[] = "abcdefg";
    3. printf("%d ", sizeof(array));
    4. const char *p = "abcdefg";
    5. printf("%d ", sizeof(p));
    6. }
    7. void func1(char p[10])
    8. {
    9. printf("%d ", sizeof(p));
    10. }
    11. void func2(char (&p)[10])
    12. {
    13. printf("%d ", sizeof(p));
    14. }
    15. int main()
    16. {
    17. char p[10] = "hello";
    18. func0();
    19. func1(p);
    20. func2(p);
    21. printf("%d ", sizeof(char[2]));
    22. printf("%d ", sizeof(char &));
    23. return 0;
    24. }
    • 在调用func0函数时,定义了一个字符数组array并初始化,其大小为7,因为包括末尾的'\0'字符。
    • 而指针变量p只是指向了字符串常量"abcdefg",占用的内存空间大小与指针类型相关,一般情况下是4或8个字节。所以第一个printf输出7,第二个printf输出4或8。
    • 在调用func1func2函数时,传入了一个大小为10的字符数组p,但是在func1中,p被视为指向字符的指针,并不知道它的大小,所以输出的大小为4或8;
    • 而在func2中,p被视为一个大小为10的字符数组的引用,所以输出大小为10
    • 最后两行printf分别输出sizeof(char[2])sizeof(char &),前者表示字符数组char[2]的大小,即两个字符占用的空间大小,为2;
    • 后者表示对字符的引用占用空间大小,一般为1个字节。

    C语言 sizeof操作符详解-CSDN博客

    C语言 sizeof(struct)讲解_sizeof(struct)-CSDN博客

  • 相关阅读:
    如何在你的 Flutter 中使用 input chip 标签组件
    【【SOC设计之 数据回路从 DMA到 FIFO再到BRAM 再到FIFO 再写回DMA】】
    中文drupal教程2. 请求对象Request及请求堆栈
    springmvc、springBoot---第三篇
    重写代码实现Flink连接Redis集群(Java版,解决Flink无法连接私有IP Redis集群问题)
    C++语法——详解运算符重载
    【三维目标检测】Part-A2(一)
    Web3:数字身份与隐私保护的新篇章
    4k、VR与万兆光网
    YashanDB混合存储揭秘:行式存储如何为高效TP业务保驾护航(上)
  • 原文地址:https://blog.csdn.net/qq_51519091/article/details/132910827