一:以下代码打印的结果是(假设运行在 64 位计算机上):
struct st_t
{
int status;
short *pdata;
char errstr[32];
};
st_t st[16];
char *p=(char *)(st[2].esstr+32);
printf(“%d”,(p-(char *)(st)));
解析:
这个是题目的地址分配
32位环境 4字节对齐 指针占4字节 64位环境 8字节对齐 指针占8字节
因为是64位环境下
int status;虽然int只占用4个 由于后面的指针八个字节放不下 填补不了空位 所以对其要八个字节
short *pdata; 这个指针会占用8个字节
char errstr[32]; 占用32个字节
所以一共占用 8+8+32=48个字节
char *p=(char *)(st[2].esstr+32),p实际指向了st[3]
则p-(char )(st)),即为&st[3]-&st[0],占用空间为3个结构体的大小,即348=144。
二:
执行如下程序代码
char chr = 127;
int sum = 200;
chr += 1;
sum += chr;
后,sum的值是 ; ( )
解析:在c语言下, char的取值范围是0-127,chr+1后发生溢出,127的二进制为01111111,加1后发生溢出变为10000000,按照有符号数补码运算为11111111即-128,所以sum的值为200-128=72。