Tag: struct

为什么内部Lua字符串以他们的方式存储?

我想要一个简单的字符串表来存储一堆常量,我想“嘿!Lua那样做,让我使用一些函数!” 这主要是在lstring.h / lstring.c文件中(我使用的是5.2) 我将首先展示我很好奇的代码。 它来自lobject.h /* ** Header for string value; string bytes follow the end of this structure */ typedef union TString { L_Umaxalign dummy; /* ensures maximum alignment for strings */ struct { CommonHeader; lu_byte reserved; unsigned int hash; size_t len; /* number of characters in string */ } tsv; } TString; […]

为什么在这个接口中使用`typedef void * COMPLEX`?

我有一个程序,我无法理解它是如何工作的。 这是它的一部分。 我不明白行typedef void *COMPLEX ,这个命令以及为什么使用struct COMPLEX_IMPL 。 #ifndef _COMPLEX_H #define _COMPLEX_H typedef void *COMPLEX; COMPLEX NewCOMPLEX (double a, double b ); void DeleteCOMPLEX(COMPLEX this ); double GetA (COMPLEX this ); double GetB (COMPLEX this ); COMPLEX AddComplex (COMPLEX c1, COMPLEX c2, COMPLEX res); COMPLEX MultComplex (COMPLEX c1, COMPLEX c2, COMPLEX res); #endif /* _COMPLEX_H […]

变量的前向声明?

我有一些C代码,我必须移植到C ++。 代码有一个结构 struct A { … struct A * myPtr; } 现在声明和初始化两个全局数组,如下所示: //Forward declaration of Unit struct A Unit[10]; struct A* ptrUnit[2] = { Unit, Unit+7 }; struct A Unit[10] = { { .., &ptrUnit[0] }, … }; 现在虽然这在C中运行良好,但它在C ++中给出了错误(变量重新声明)。 是不是允许变量在C ++中进行前向声明?

C中的“私有”结构成员与const

为了拥有一个干净的代码,使用一些OO概念可能是有用的,即使在C中。我经常编写由一对.h和.c文件组成的模块。 问题是模块的用户必须小心,因为C中不存在私有成员。使用pimpl习语或抽象数据类型是可以的,但是它添加了一些代码和/或文件,并且需要更重的代码。 我讨厌在不需要时使用访问器。 这是一个想法,它提供了一种方法,使编译器抱怨对“私有”成员的无效访问,只需要几个额外的代码。 我们的想法是定义两次相同的结构,但为模块的用户添加了一些额外的“const”。 当然,演员也可以写“私人”成员。 但重点是避免模块用户的错误,而不是安全地保护内存。 /*** 2DPoint.h module interface ***/ #ifndef H_2D_POINT #define H_2D_POINT /* 2D_POINT_IMPL need to be defined in implementation files before #include */ #ifdef 2D_POINT_IMPL #define _cst_ #else #define _cst_ const #endif typedef struct 2DPoint { /* public members: read and write for user */ int x; /* private members: […]

使用scanf扫描一行中的多个输入

我正在尝试扫描单行输入并将其存储在结构中。 我不确定我是否存储错误或者我打错了。 我不确定如何将scanf与for循环一起使用,因为我从来没有这样做过,更不用说C喜欢覆盖东西了。 所以我不确定如何处理这个问题。 这是我放在一起的东西,但是当我打印时,我得到了垃圾数字。 我本打算使用指针,但我的教授不会让我们使用它。 这就是我遇到麻烦的原因。 EDITED #include #include #include #define MAX 3 #define MAXTRIP 6 struct stop { float cost; float time; }; struct trip { char Dest_letter; int stop_num; struct stop leg[MAX]; }; int main(void) { int trip_num, index, i; struct trip travel[MAXTRIP]; printf(“Enter number of trips: “); scanf(“%d”, &trip_num); printf(“Please enter […]

枚举是否永远不会在API中使用?

我正在使用提供给我的C库。 我在编译库时使用的编译器,版本,选项等信息有限。 库接口在传递的结构中使用enum ,并直接作为传递的参数使用。 问题是:当我编译代码以使用提供的库时,我如何保证或确定我的编译器将使用相同大小的enum ? 如果没有,则结构将不会排列,并且参数传递可能会混乱,例如long与int 。 我的担忧源于C99标准,该标准规定了enum类型: 应与char,有符号整数类型或无符号整数类型兼容。 类型的选择是实现定义的,但应能够表示枚举的所有成员的值。 据我所知,只要最大值适合,编译器就可以选择任何类型,它非常随意,有效地随心所欲,不仅可能在编译器之间变化,而且可能在同一编译器和/或编译器选项的不同版本之间变化。 它可以选择1,2,4或8字节表示,从而导致结构和参数传递中的潜在不兼容性。 (它也可以选择签名或未签名,但我没有看到在这种情况下出现问题的机制。) 我在这里错过了什么吗? 如果我没有遗漏某些内容,这是否意味着永远不应该在API中使用enum ? 更新: 是的,我错过了什么。 虽然语言规范在这里没有帮助,但正如@Barmar所指出的应用程序二进制接口(ABI)所做的那样。 或者如果没有,则ABI不足。 我系统的ABI确实指定enum必须是带符号的四字节整数。 如果编译器不服从,那就是一个bug。 给定完整的ABI和兼容编译器, enum 可以在API中安全使用。

具有位字段的结构中的偏移量

如果我们有一个带有位字段的结构,那么后续成员如何在结构中对齐? 请考虑以下代码: struct A{ int a:1; char b; // at offset 1 }; struct B{ int a:16; int b: 17; char c; // at offset 7 }; printf(“Size of A: %d\n”, (int)sizeof(struct A)); printf(“Offset of b in A: %d\n”, (int)offsetof(struct A, b)); printf(“Size of B: %d\n”, (int)sizeof(struct B)); printf(“Offset of c in B: %d\n”, (int)offsetof(struct […]

这个尺寸对齐是如何工作的

关于提供的评论,我无法理解以下代码。 这段代码做了什么,以及8-aligned的等效代码是什么? /* segment size must be 4-aligned */ attr->options.ssize &= ~3; 这里, ssize是unsigned int类型。

C问题:为什么char实际占用内存中的4个字节?

我写了一个小程序来检查我的内存中char占用了多少字节,它显示char实际占用内存中的4个字节。 我理解这主要是因为字对齐并且没有看到char只有1个字节的优点。 为什么不使用4个字节的char? int main(void) { int a; char b; int c; a = 0; b = ‘b’; c = 1; printf(“%p\n”,&a); printf(“%p\n”,&b); printf(“%p\n”,&c); return 0; } 输出:0x7fff91a15c58 0x7fff91a15c5f 0x7fff91a15c54 更新:我不相信malloc只会为char分配1个字节,即使sizeof(char)作为参数传递,因为malloc包含一个标题将确保标题是字对齐的。 任何意见? Update2:如果要求你有效地使用没有填充的内存,唯一的方法是创建一个特殊的内存分配器? 或者是否可以禁用填充?

C结构大小对齐

我希望C结构的大小是16个字节的倍数(16B / 32B / 48B / ..)。 它到达的大小无关紧要,它只需要16B的倍数。 我怎么能强制编译器这样做? 谢谢。