Tag: 结构

C结构指针 – 分段故障

我遇到了这个程序的问题。 这很简单。 我需要从我创建的指针中为我的结构赋值,但是我一直遇到分段错误。 我有什么想法我做错了: #include #include struct problem37 { int a; int b; int c; }; int main() { printf(“Problem 37\n”); //create struct struct problem37 myStruct; //create the pointer int* p; int* q; int* r; *p = 1; *q = 5; *r = 8; //read the data into the struct using the pointers myStruct.a = […]

包装结构(gcc)去

我有一些旧的C代码,有点大量使用打包结构。 我正在考虑使用Go作为此代码的包装器,但是很难找到传递或甚至为这些结构编写定义的方法。 例: import “unsafe”; type AlignTest struct { c byte; y int16; z int16; q int32; } func main() { vr := new(AlignTest); fmt.Println(unsafe.Sizeof(*vr), “\n”); } 使用打包/未对齐的结构返回12而不是1 + 2 + 2 + 4 = 9。 我知道我可以创建一个字节数组并手动进行解析,但这看起来非常脆弱且容易出错……

使用Malloc在C中定义结构

我之前问了一个关于使用malloc定义结构的问题 。 这是大多数人给出的答案: struct retValue* st = malloc(sizeof(*st)); 我向朋友展示了我的代码,我们遇到了绊脚石。 有人可以解释为什么这段代码有效吗? 从我的观点来看,当你使用malloc时没有定义* st,因此那里可能存在任何类型的垃圾。 它应该是malloc(sizeof(struct retValue)) 谢谢你的帮助

声明没有声明任何内容:警告?

#include #include #include int main() { struct emp { struct address { int a; }; struct address a1; }; } 此代码显示警告: – 警告:声明不声明任何内容(默认情况下启用) 以下代码显示没有警告的位置 #include #include #include int main() { struct emp { struct address { int a; }a1; }; } 为什么’警告’仅显示在第一个代码中?

为什么位域的类型会影响包含结构的大小?

首先,这是ISO C标准关于位域的内容,引用2011年ISO C标准的N1570草案,第6.7.2.1节: 位字段的类型应为_Bool , signed int , unsigned int或其他实现定义类型的限定或非限定版本。 它是实现定义的,是否允许primefaces类型。 … 位字段被解释为具有由指定位数组成的有符号或无符号整数类型。 如果将值0或1存储到_Bool类型的非零宽度位字段中,则位字段的值应等于存储的值; _Bool位字段具有_Bool的语义。 实现可以分配足够大的任何可寻址存储单元来保持位字段。 如果剩余足够的空间,则紧跟在结构中的另一个位字段之后的位字段将被打包到相同单元的相邻位中。 如果剩余的空间不足,则是否将不适合的位域放入下一个单元或重叠相邻单元是实现定义的。 单元内的位域分配顺序(高阶到低阶或低阶到高阶)是实现定义的。 未指定可寻址存储单元的对齐。 对于任何struct类型,类型的对齐方式至少是该类型的任何成员的最大对齐方式,并且任何类型的大小都是其对齐方式的倍数。 例如,如果结构包含(非位域) int成员,并且int需要4字节对齐,则结构本身需要4字节对齐或更多。 许多编译器允许除_Bool和int类型之外的整数类型的位字段。 对于至少一些编译器,包含位字段的struct的对齐至少是声明的位字段类型的对齐。 例如,对于x86_64上的gcc 4.7.2,给出: struct sb { _Bool bf:1; }; struct si { unsigned bf:1; }; gcc给struct sb一个大小和1个字节的对齐(这是_Bool的大小和对齐), struct si是一个大小和4个字节的对齐(这是int的大小和对齐)。 它对实现定义类型的位字段做了同样的事情; 位字段定义为long long bf:1; 强制封闭结构的8字节大小和对齐。 即使在两种情况下,位字段bf是宽度仅为1位的对象,也可以完成此操作。 我在SPARC / Solaris 9上看到了与Sun编译器类似的行为。 实验表明,定义为_Bool或unsigned多个位字段可以打包到单个字节内的相邻位(实际上是必需的),因此位字段本身没有严格的对齐要求。 我理解结构成员的布局主要是实现定义的,我不相信gcc的行为违反了C标准。 […]

使用recvfrom()和sendto()发送结构

我使用的是C语言 ,它是服务器和客户端的通用平台 。 我有一个特定类型的结构,我想从服务器发送到客户端。 例如 服务器代码 //necessary declarations struct hostent *hp; hp=gethostbyname(“www.google.com”); sendto(sockDes,&hp,sizeof(hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr)); 客户代码 struct hostent *hp; msg=recvfrom(mysock,&hp,sizeof(hp),0,(struct sockaddr)&serv_addr,&size_len); 所以,基本上我想从服务器向客户端发送一个结构。 但是从上面的代码中我得到了分段错误,我不确定这种结构转移是否可行。 有什么出路吗?

二进制文件读/写C语言

所以我有一个input.bin文件,其中包含以下内容 IK-SZH;jdl72u;John Doe;2013-03-28 11:05 IK-GRR;kat91n;Jane Doe;2013-03-21 15:41 IK-GRR;oat62f;Jane Doe;2013-03-24 08:08 我正在做的是把它读成一个结构。 用数据做一些事情。 添加/删除行。 然后我想以与上面相同的格式将结构的内容写回input.bin文件。 但不是像上面那样出现。 就像这样(没有空格): IK-SZH NUL jdl72u NUL John Doe NUL NUL NUL NUL NUL 2013-03-28 NUL NUL NUL IK-GRR NUL kat91n NUL Jane Doe NUL NUL NUL NUL … 当我重新读取文件(使用NUL)时,它只将第1行放入结构中 我的代码 typedef struct foo { char kid[7]; char jid[7]; char name[21]; char […]

如何在C 中声明指向结构数组的指针

指针和C的新手,我的程序需要一个结构数组的指针,并能够将此指针传递给函数。 声明struct数组类型的指针的正确方法是什么?我的函数参数应该采用哪种指针? 这是我的尝试: #define HAND_SIZE 5 struct Card { char suit; char face; }; void printHandResults(struct Card *hand[HAND_SIZE]); int main(void) { struct Card hand[HAND_SIZE]; struct Card (*handPtr)[HAND_SIZE]; //Correct way to declare? handPtr = &hand; … printHandResults(handPtr); } void printHandResults(struct Card *hand[HAND_SIZE]) { … } 这是我得到的警告: warning: incompatible pointer types passing ‘struct Card (*)[5]’ to parameter […]

何时使用联合以及何时使用结构

我知道联盟和结构之间的差异。 但是从设计和编码的角度来看,使用union而不是结构的各种用例是什么? 一个是空间优化。 使用它们还有什么好处吗?

无效使用灵活数组 – 灵活结构数组作为另一个结构的成员

我开始学习C中结构的使用。它具有挑战性和乐趣。 不用说我遇到了一个我似乎无法弄清楚的问题。 我正在尝试将灵活的struct数组作为另一个struct的成员,但我收到一个错误: 无效使用灵活数组 我究竟做错了什么? #define NUM_CHANNELS 4 struct channelStruct { float volume; uint mute; }; struct enginestruct { float bpm; int synctimeinbeats; int synctimeinsamples; int currentbeat; int oneBeatInSamples; int samplerate; struct channelStruct channels[]; }; struct enginestruct engine, *engineptr; struct channelStruct channel, *channelptr; -(void) setupengine { engineptr = &engine; engineptr->oneBeatInSamples = 22050; engineptr->samplerate = 44100; […]