导航:首页 > 源码编译 > 编译器结构体成员

编译器结构体成员

发布时间:2022-07-18 19:35:40

⑴ 结构体成员的字节对齐

这个问题都很有深度啊;

首先我要说的是,字节对齐在不同编译器下语法是不一样的,在GCC中是#pragma push(1) #pragma pack(); 在MS C++中用VC的代码项里可以调整,默认是8字节;

typedef struct
{
char c;
int i;
}test;

字节对齐,是对齐,比如说char 与 int 如果是4字节对齐,那么char也会占用4个字节,总共占8字节,而且结构体对象存储是按照顺序存的,char 肯定在int前面。第二种情况如果1字节对齐,意味着char只占1字节,而结下来int会占用4字节,这个N字节对齐的意思是,每个成员占用空间必须是N字节的倍数,不足N字节的占用N字节。那么以1字节对齐那它占用5个字节。

还有你说的每种数据是低位还是高位在前,这个根处理器有关,Intel处理是小端对齐,比如说一个整数522387969用16进制表示是:0x1f 23 02 01,在Intel处理器中表示是0x01 02 23 1f,所以在内存用0x01 02 03 1f来示522387969,这就是所谓有小端对齐;但在arm处理器中522387969表示是0x1f 23 02 01,这就是所谓的大端对齐,这种方式又叫作网络字节序。

当然前面说的字节序只是对int long short这些内置(built in)数据类型用效,对结构体内如果有int long这类成员也会有所谓的字节序,如前面所说,不管是什么序结构体对象存储是按照顺序存,先定义的成员肯定在后定义的成员前面,但单个成员有字节序,不知这样说,你的明白?

不是,请仔细体会这句话:这个N字节对齐的意思是,每个成员占用空间必须是N字节的倍数,不足N字节的占用N字节。

大于N字节就凑够N字节的倍数,比如按3字节对齐,那么一个4字节的int将占据6字节~

⑵ 为什么结构体中的成员类型不能是该结构体本身,却可以是以该结构体类型为基本型的

我的理解,结构体的在构造的时候肯定不能引用自身,不然就会形成嵌套死循环。

通俗一点的理解,定义一个结构体的时候,在定义其成员的时候,这个结构体还未完成。发现引用了一个还未定义完成的结构体(也就是他自身),编译器会出错把。

“以该结构体类型为基本型的” 后面是不是还有话啊,就这里看不懂 ,我是不是可以这样理解,以该结构体类型为父的其他结构体。

那么这个“其他结构体”必然是已经完成构造的,在最原始的父结构体中引用,编译器不会出错,但是我觉得用起来估计会有些毛病。

⑶ C语言结构体成员定义引用问题

没有

A={
.age=10;
.class=3;
};

这种赋值方法,改成

A.age=10;
A.cass=3;

B->age=10;
B->class=3;

都行。

另:class是C++关键字,若使用的是C++兼容的C编译器,则过不了编译,应另起一名,如Class,或classs等。

⑷ c语言:结构体成员问题,如下:

char * name 是一个指针,变量name存放的一个指向字符串的首地址。
你memset之后。name变为零了。也就是说,是一个无效的指针。
对于不同的编译器和执行环境来说,有的会报错,有的则是什么也不输出。或者输出其它的错误信息。

⑸ C语言结构体成员的引用问题

scanf的用法,格式后的参数都必须是地址,name是数组名,本身就是数据,age和sex都是整型数据,必须使用取地址符&。

p是struct student*类型,stu是stu[3]这个数组的第一个元素的地址,p指向第一个元素,因此ABC都是对的,D错在把(int*)变量值赋值给(struct student*)变量,有个强制转换则不会错,因为age是结构体第一个变量,其地址就是结构体变量的地址。

是指针间的赋值,必须保证左右操作数的指针类型是一致的。由于n是结构体sk的第一个变量,因此其地址与结构体变量地址相同,可以强制转换得到正确的地址。

c是一个二维数组,p是一个指向数组的指针,因此p的*运算都是得到一个数组,**运算才能取到数组中的值。只有D是**运算。

(5)编译器结构体成员扩展阅读:

C语言初学者比较喜欢的Turbo C2.0提供了400多个运行时函数,每个函数都完成特定的功能,用户可随意调用。这些函数总体分成输入输出函数、数学函数、字符串和内存函数、与BIOS和DOS有关的函数、 字符屏幕和图形功能函数、过程控制函数、目录函数等。

Windows系统所提供的Windows SDK中包含了数千个跟Windows应用程序开发相关的函数。其他操作系统,如Linux,也同样提供了大量的函数让应用程序开发人员调用。

参考资料来源:网络-C语言

⑹ 结构体变量与结构体成员能同名吗

结构体,在C++中,是一个类而已。所以,不管是类,还是结构体,它产生的对象名,其实是可以与成员同名的。
所以A是错的。而B和C,因为编译器根本不会为结构体分配内存,而只是为结构体变量分配内存。
例如:
struct Student
{
int num;
int age;
char sex;
}
void main()
{
cout<<sizeof(Student)<<endl;//可以测得Student的大小
//cout<<&Student<<endl; //这句非法,因为不能对结构体进行取地址运算
Student s; //声明一个结构体变量s
cout<<&s<<endl;//对s取地址
}

而D选项,st根本不是外部的结构体。
所以这道题应该没有正确答案。
做题,其实没有实际意义,只有实际去编程才有意义。

⑺ 怎样添加和删除结构体中的成员怎样搜索已经存在的成员

添加和删除只能修改这个
结构体
的定义了。
至于查看已经存在的成员,如果你使用的
编译器
自动提示,比如在本结构体的一个变量后加'.',就能显示已经存在的成员了。要是不行,你只能查看定义了。

阅读全文

与编译器结构体成员相关的资料

热点内容
喷油螺杆制冷压缩机 浏览:576
python员工信息登记表 浏览:375
高中美术pdf 浏览:157
java实现排列 浏览:511
javavector的用法 浏览:978
osi实现加密的三层 浏览:230
大众宝来原厂中控如何安装app 浏览:910
linux内核根文件系统 浏览:240
3d的命令面板不见了 浏览:521
武汉理工大学服务器ip地址 浏览:143
亚马逊云服务器登录 浏览:521
安卓手机如何进行文件处理 浏览:69
mysql执行系统命令 浏览:925
php支持curlhttps 浏览:142
新预算法责任 浏览:443
服务器如何处理5万人同时在线 浏览:247
哈夫曼编码数据压缩 浏览:424
锁定服务器是什么意思 浏览:382
场景检测算法 浏览:616
解压手机软件触屏 浏览:348