求 sizeof(name1)?(晟安信息)
struct name1{char str;short x;int num;
};
答案:8字节
分析:结构体会按照字节对齐的特点进行计算大小,首先按照最长数据结构的字节长度进行计算,也就是四字节,按顺序排列char一字节,short两字节,int四字节,char和short可以在一个步长内,所以四字节就行了,加上int的四字节,一共是八字节
sizeof(a) = _______;
sizeof(b) = _______;
typedef struct _a{char c1;long i;char c2;double f;
}a;typedef struct _b{char c1;char c2;long i;double f;
}b;
答案:a:32字节,b:24字节
分析:按照最长数据类型计算步长,double就是8字节
在a中char:1字节,long:8字节,char:1字节,double:8字节;首先为第一个char分配8字节长度,long8字节与第一个数据无法放在一个长度里面,所以再分配8字节长度,char再分配8个字节,double8字节,无法跟上一个1char放在一个长度中,所以又分配了一个8字节,结果时4个8字节,也就是32个字节
在b中char:1字节,char:1字节,long:8字节,double:8字节;首先前两个char一共2字节,可以放在一个数据长度内,所以分配8字节,long和double两个都是8字节,分配两个8字节长度,所以一共时3个8字节长度,也就是24字节
给了一个结构体,求 sizeof(struct A) = ________。
struct A{char a;char b;char c;short d;int e;short f;
}
答案:16字节
分析:按照最大数据类型长度看,int是4字节
前三个char一共3字节,可以放在一个长度内,short2字节,只能新开4字节,int4字节,也只能占4字节,最后short也只能新开4个字节,结果是4个4字节,一共16个字节
有一个如下的结构体,请问在64位编译器下用 sizeof(struct A) 计算出的大小是多少?
struct A{long a1;short a2;int a3;int *a4;
}
A. 24 B. 28 C. 16 D. 18
答案:A
分析:最大的是long八字节,步长是8字节
long独占8字节,short和int共占8字节,最后int独占8字节
有以下说明语句,则下列错误的引用 是( )
struct stu{int no;char name[21];
};
stu w, *p = &w;
A. w.no B*p.no C. p->no D. (*p).no
答案:B
分析:对于结构体来说,直接使用 . 即可,所以A正确,对于结构体指针来说,使用 -> 即可,所以C正确,如果对指针取址,需要用括号将去包裹起来,也就是D正确
写出下述程序结果:
typedef struct test{char x1;short x2;float x3;char x4;
}TEST_T;
printf("%d", sizeof(TEST_T));
答案:12
分析:最长数据长度为4字节,所以步长为4
char和short共占4字节长度,flort占一共4字节长度,char独占4字节长度,结果是12字节长度
下面的代码输出是什么,为什么?(64位环境)
struct{char *a1;long a2;short a3;
}A;
int main(void){printf("%d", sizeof(A));
}
答案:24字节
分析:最长数据长度为long,是8字节,指针也是8字节长度,结果是指针和long各占8字节长度,short独占8字节长度,结果是3个8字节长度,一共24字节长度
设有如下结构定义: struct student { int num; char name[20]; char sex; int age; char addr[30];} stud; 若用printf("%s\n", .....)访问该结构中name值的正确方法是 ( ) (杭州快越科技)
A. stud -> name B. &stud.name
C. stud.&name D. stud.name
答案:D
分析:stu是结构体不是指针,所以不需要用->来取值,所以A错误,用%s输出,直接取结构体内的数组名即可,所以D争取
sizeof(cs)的值是( ) (苏州特点电子科技)
struct{short a; char b; float c;
}cs;
A.4 B.5 C.7 D.8
答案:8
分析: 最长数据类型为float,4字节,short和char一起占4字节长度,float占4字节长度,所以占2个四字节长度,结果是8字节长度
如下函数的输出结果是:【 】
struct node{char a; short b; char c; int d;
};
struct node s = { 3, 5, 6, 99 };
struct node *pt = &s;
printf("%X\n", *(int*)pt);
答案:00050003
分析:首先分析数据步长,最长位int四字节步长,所以,char和short放在一个步长内,所以当对结构体指针强转后,只能操作前四个字节,也就是3和5,而操作系统一般都是小端存储,所以会将数据低位放在地址低位,结果就是00050003
编程题:定义学生结构体,存储学生的学号、姓名、分数,定义长度为5的结构体数组,实现:
①输入学生信息
②输出学生信息
③计算学生的成绩总分、平均分
④按照学生的分数进行排序
⑤输出排序后的数组
#include<stdio.h>
#include <malloc.h>
#include <string.h>#define MAXSIZE 5
//Stu结构体,id:学号;name:姓名;grade:成绩
typedef struct {char id[10];char name[20];int grade;
}Stu;//动态分配结构体数组大小函数,n:结构体数组长度;返回值:结构体数组地址
Stu *input( int i);
//输出函数,info:结构体数组地址;n:结构体数组长度;返回值:无
void output(Stu *info, int i);
//成绩求和函数,info:结构体数组地址;n:结构体数组长度;返回值:成绩和
int sum_grade(Stu *info, int i);
//成绩求平均值函数,info:结构体数组地址;n:结构体数组长度;返回值:成绩平均值
double avg_grade(Stu *info, int i);
//排序函数,info:结构体数组地址;n:结构体数组长度;返回值:无
void sort_info(Stu *info, int n);int main(){//通过指针的方式创建结构体数组Stu *info = input(MAXSIZE);//调用输出函数output(info,MAXSIZE);//用sum容器接收求和函数返回值int sum = sum_grade(info,MAXSIZE);printf("Grade sum : %d\n",sum);//用avg容器接收求平均值函数返回值double avg = avg_grade(info,MAXSIZE);printf("Grade avg : %.2lf\n",avg);//调用分数排序函数,排列结构体数组sort_info(info, MAXSIZE);//调用输出函数output(info,MAXSIZE);//释放内存,指针指空free(info);info = NULL;return 0;
}
//动态分配结构体数组大小函数,n:结构体数组长度;返回值:结构体数组地址
Stu *input(int n) {//动态分配数组大小Stu *p = (Stu *)malloc(sizeof(Stu) * n);//判断是否创建成功if(NULL == p){printf("分配失败!\n");return NULL;}//循环输入结构体信息for (int j = 0; j < n; ++j) {printf("请输入第 %d 个学生信息:(格式:id name grade)\n",j + 1);scanf("%s %s %d", (p + j)->id, (p + j)->name, &(p + j)->grade);}//返回地址return p;
}
//输出函数,info:结构体数组地址;n:结构体数组长度;返回值:无
void output(Stu *info, int n) {//判空if(NULL == info) return;//循环输出结构体数组信息for (int i = 0; i < n; ++i) {printf("id : %s name : %s grade : %d\n",(info + i)->id,(info + i)->name,(info + i)->grade);}
}
//成绩求和函数,info:结构体数组地址;n:结构体数组长度;返回值:成绩和
int sum_grade(Stu *info, int n) {//判空if(NULL == info) return -1;//创建和容器int sum = 0;//循环求和for (int i = 0; i < n; ++i) {sum += (info + i)->grade;}//返回和return sum;
}
//成绩求平均值函数,info:结构体数组地址;n:结构体数组长度;返回值:成绩平均值
double avg_grade(Stu *info, int n) {//判空if(NULL == info) return -1;//创建平均值容器int avg = 0;//循环求和,然后求平均值for (int i = 0; i < n; ++i) {avg += (info + i)->grade;}avg /= n;//返回平均值return avg;
}
//排序函数,info:结构体数组地址;n:结构体数组长度;返回值:无
void sort_info(Stu *info, int n) {//判空if(NULL == info) return;//创建换值中间容器Stu p;//选择排序for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {if((info + i)->grade > (info + j)->grade){//将info[i]的值赋给中间容器pstrcpy(p.id,(info + i)->id);strcpy(p.name,(info + i)->name);p.grade = (info + i)->grade;//将info[j]的值赋给info[i];strcpy((info + i)->id,(info + j)->id);strcpy((info + i)->name,(info + j)->name);(info + i)->grade = (info + j)->grade;//将中间值容器p的值赋给info[i];strcpy((info + j)->id,p.id);strcpy((info + j)->name,p.name);(info + j)->grade = p.grade;}}}
}