Tag: struct

递归释放C结构

我有一个结构,只包含我已分配的内存指针。 有没有办法以递归方式释放每个指针而不是每个指针都自由的元素? 例如,假设我有这样的布局: typedef struct { … } vertex; typedef struct { … } normal; typedef struct { … } texture_coord; typedef struct { vertex* vertices; normal* normals; texture_coord* uv_coords; int* quads; int* triangles; } model; 在我的代码中我malloc每个结构创建一个模型: model* mdl = malloc (…); mdl->vertices = malloc (…); mdl->normals = malloc (…); mdl->uv_coords = malloc (…); mdl->quads […]

MPI和C结构

我不得不承认,看到用MPI传输一个C结构需要多少行代码,我感到非常震惊。 在什么情况下使用预定义的数据类型MPI_CHAR简单地传输结构? 请考虑以下示例: struct particle { double x; double y; long i; }; struct particle p; MPI_Isend(&p, sizeof(particle), MPI_CHAR, tag, MPI_COMM_WORLD, &sendr); 在我的例子中,所有进程都在相同的架构上运行。 填充是唯一的问题吗?

c中的查找表

我在C中创建一个查找表当我定义它时: typedef struct { char* action; char* message; } lookuptab; lookuptab tab[] = { {“aa”,”bb”}, {“cc”,”dd”} }; 它编译没有错误,但当我做这样的事情: typedef struct { char* action; char* message[]; } lookuptab; lookuptab tab[] = { {“aaa”, {“bbbb”, “ccc”}}, {“cc”, {“dd”, “eeeee”}} }; 我收到以下错误: 错误:在嵌套上下文中初始化灵活数组成员 错误:(接近初始化’tab [0] .message’) 如何在第二个示例中初始化选项卡数组? 注意:我知道选项卡数组中的所有值。 更新:消息可以是不同的大小,例如 typedef struct { char* action; char* message[]; } lookuptab; […]

ANSI C是否支持有符号/无符号位字段?

将位字段限定为有符号/无符号是否有意义?

C中静态结构的成员变量

我有一个关于C语言中静态结构的成员变量的问题。 有人说我们可以声明一个static struct ,但是在C中,struct没有像C ++中的类那样的静态成员,这是什么意思? 如果我声明一个静态结构,那么成员变量的状态是什么? 有人可以帮我吗?

打印返回结构的成员

我在打印从函数返回的结构的成员时遇到问题: #include struct hex_string { char a[9]; }; struct hex_string to_hex_string_(unsigned x) { static const char hex_digits[] = “0123456789ABCDEF”; struct hex_string result; char * p = result.a; int i; for (i = 28; i >= 0; i -= 4) { *p++ = hex_digits[(x >> i) & 15]; } *p = 0; printf(“%s\n”, result.a); /* works […]

结构内部结构

我必须创建一个人,每个人都应该有一个冰箱。 这是最好的方式吗? 如果是这样,我做错了什么? 提前致谢。 typedef struct { int age; struct FRIDGE fridge; } PERSON; typedef struct { int number; } FRIDGE; FRIDGE fr; fr.number=1; PERSON me; me.name=1; me.fridge = fr; 这给了我以下错误: 错误:字段’冰箱’的类型不完整

C90:如何在没有C99扩展的情况下在C中全局初始化此结构

我想知道用C90初始化这个结构的最好方法是什么,同时仍保持整洁。 在我的头文件中,将其命名为test.h,我定义了以下结构: struct s_test_cfg{ char *a[3]; char *b[3]; char *c[3]; } 然后我将它声明为extern结构,以便我可以在.c文件中全局初始化它: extern struct s_test_cfg test_cfg; 现在在我的.c文件中,我希望能够在全局范围内声明这样的东西(显然我要编写的内容在C90中不受支持): struct s_test_cfg test_cfg = { .a = {“a”, “b”, “c”},\ .b = {“d”, “e”, “f”},\ .c = {“g”, “h”, “i”} }; 这显然使你对你想要做的事情非常整洁和透明。 如何初始化我的C文件中的全局结构,该结构也像这种语法一样干净? 谢谢。

尝试在结构上使用scanf时出现分段错误

我对c很陌生,此刻我也非常沮丧。 这是我的代码: typedef struct { char* fName; char* lName; char* pNum; char* address; char* email; } contactInfo; void addContact(){ contactInfo *contact; contact = (contactInfo *) malloc (sizeof(contactInfo)); printf(“\n[Add a contact]\nFirst Name: “); scanf(“%s”, contact->fName); printf(“%s”, contact->fName); } 出于某种原因,当我输入scanf的值时,它会给我一个分段错误。 如果我尝试在contact-> fName前添加&,我也会收到错误。 代码有什么问题?

别名结构和数组是否合法?

在结构中相同类型的连续成员之间的指针算术过去常常是一种常见的做法,而指针算术仅在数组内有效。 在C ++中,它将是明确的Undefined Behavior,因为数组只能由声明或新表达式创建。 但是C语言将数组定义为具有特定成员对象类型的连续分配的非空对象集,称为元素类型。 (n1570 C11草案,6.2.5类型§20)。 因此,如果我们可以确保成员是连续的(意味着它们之间没有填充),那么将其视为数组是合法的。 这是一个简化的示例,它在没有警告的情况下编译,并在运行时给出预期的结果: #include #include #include struct quad { int x; int y; int z; int t; }; int main() { // ensure members are consecutive (note 1) static_assert(offsetof(struct quad, t) == 3 * sizeof(int), “unexpected padding in quad struct”); struct quad q; int *ix = &q.x; for(int i=0; […]