• 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博客

  • 相关阅读:
    流量攻击:如何有效利用网络漏洞
    电容笔和Apple Pencil有什么区别?双十一好用电容笔推荐
    QT+OSG/osgEarth编译之三十三:HDF5+Qt编译(一套代码、一套框架,跨平台编译,版本:HDF5-1.12.2)
    【时间序列】时间序列预测基本方法:移动平均(SMA,EMA,WMA)
    YOLOv5改进原创 HFAMPAN 结构,信息高阶特征对齐融合和注入,全局融合多级特征,将全局信息注入更高级别
    java-net-php-python-jsp汽车租赁管理系统计算机毕业设计程序
    cmake 之add_definitions使用误区
    程序员的快乐如此简单
    美易官方:AI热潮“熄火”了?Meta Q1财报较差
    第五章 神经网络
  • 原文地址:https://blog.csdn.net/qq_51519091/article/details/132910827