1. 关于strlen和sizeof

(1)char a[5] = "1,2,3,4,5";

strlen(a) = 11

sizeof(a) = 5

(2)char a[8] = "1,2,3,4,5";

strlen(a) = 5

sizeof(a) = 8

(3)string str = "12345";

sizeof(str) = 16

(4)string str = "123456789123456789";

sizeof(str) = 16

总结:

char a[5]是个数组,数组的初始化 是 如果不够就补0 ,char a[5] = "1,2,3,4,5" 刚好 5个 ,strlen 不知道什么时候会停 ,所以这个打印应该是随机的

对字符数组使用strlen,若数组没有满,strlen=数组中元素的个数

对字符数组使用sizeof,sizeof=数组大小,与数组中元素的个案无关

对string使用strlen,语法错误

对string使用sizeof,sizeof=16,要看string是怎么实现的。

2. 结构体中成员的存储

2.1. 结构体的大小

下面程序的输出结果为()

#pragma pack(8)   
union A  
{  
    char a[13];  
    int b;  
};  
int main(void)  
{  
    cout<<sizeof(A)<<endl;  
    return 0;  
}

A、4 B、8 C、16 D、12

答:C

2.2. 结构体成员的存储

1、下面程序的输出结果为()

struct Test  
{  
    unsigned short int a:5;  
    unsigned short int b:5;  
    unsigned short int c:6;  
};  
int main(void)  
{  
    Test test;  
    test.a=16;  
    test.b=4;  
    test.c=0;  
    int i=*(short*)&test;  
    printf("%d\n",i);  
    return 0;  
}

A、6 B、144 C、5 D、95

答:B

1、程序中':'的作用,如 unsigned short int a:5;表示变量a占了5个bit的空间,这样的话结构体所占的变量空间为5+5+6,暂且表示为000000|00000|00000,对应c|b|a 2、在主程序中对结构体初始化a=16,b=4,c=0,转换为二进制放到上面的空间,000000|00100|10000同样对应a|b|c 3、后面一句int i=(short)&test;取结构体test的地址空间,就是上面的000000|00100|10000,转换成short型,也就是144

2、下面程序的输出结果为()

#include<stdio.h>
union myun
{
  struct
  {
  int x, y, z;
  }u;
  int k;
}a;

int main()
{
  a.u.x=4; a.u.y=5; a.u.z=6;
  a.k=0;
  printf("%d\n",a.u.x);
}

分析:输出0 x和k共用一个存储单元,语句a.k=0;覆盖掉了a.u.x的值。

results matching ""

    No results matching ""