Tag: struct

free()跟随指针吗?

我确定它没有,但也许它里面有黑魔法,所以这是我的问题: 如果我有这样的结构: struct mystr { char * strp, unsigned int foo, }; 我为它分配内存,并希望稍后发布。 我必须这样做吗? free(mystr_var->strp); free(mystr_var); 或者是最后一行, free()函数是否遵循指针并释放它们两个?

如何在结构中引用未定义的类型是合法的?

作为回答另一个问题的一部分,我遇到了一段像这样的代码,gcc编译时没有抱怨。 typedef struct { struct xyz *z; } xyz; int main (void) { return 0; } 这是我一直用来构造指向自己的类型的方法(例如,链接列表),但我一直认为你必须命名结构,以便你可以使用自引用。 换句话说,您无法在结构中使用xyz *z ,因为此时typedef尚未完成。 但是这个特定的样本没有命名结构,它仍然编译。 我原本认为编译器中有一些黑魔法会自动翻译上面的代码,因为结构和typedef名称是相同的。 但是这个小小的美也可以: typedef struct { struct NOTHING_LIKE_xyz *z; } xyz; 我在这里想念的是什么? 这似乎是一个明显的违规,因为在任何地方都没有定义任何struct NOTHING_LIKE_xyz类型。 当我从指针更改为实际类型时,我得到预期的错误: typedef struct { struct NOTHING_LIKE_xyz z; } xyz; qqq.c:2: error: field `z’ has incomplete type 此外,当我删除struct ,我得到一个错误(解决parse error before “NOTHING […]

如果结构定义了uint16_t字和uint8_t字节,则数组的大小加倍

我有一个数组,每个数组的元素可以是uint16_t或一对uint8_t。 它的元素被定义为uint16_t和2 uint8_t的子数组的并集。 不幸的是,编译器(MicroChip XC16)分配的内存量应该是arrays的两倍。 typedef union { uint16_t u16; // As uint16_t uint8_t u8[2]; // As uint8_t } my_array_t; my_array_t my_array[1]; // 1 word array, for testing my_array[0].u8[0] = 1; my_array[0].u8[1] = 2; uint8_t byte_0 = my_array[0].u8[0]; // Gets 0x01 uint8_t byte_1 = my_array[0].u8[1]; // Gets 0x02 uint16_t byte_0 = my_array[0].u16; // Gets 0x0201 […]

`typedef struct foo {int bar};`的合法性

这个问题来自问题是结构{…}; 一个类型或一个未命名的变量? 在那个问题上,OP问了一下 typedef struct student_s { char* name; int age; double height; struct student_s* next; }; 我问的是上述的合法性。 当编译包含上述代码的代码时,是否需要诊断(或使其更简单, typedef struct foo {int bar;}; )? 我的看法是合法的,从语言律师的角度来看,不需要诊断。 (旁白:我不主张使用它。它非常值得诊断。如果我错误地编写了如上所述的代码,我非常希望编译器警告我。) C11标准的第6.7节规定了声明的语法: declaration-specifiers init-declarator-list opt ; 请注意, init-declarator-list是可选的。 这可能导致人们认为typedef int; 已validation。 这不是因为标准也说明了这一点 除static_assert声明之外的声明应至少声明一个声明符(除函数的参数或结构或联合的成员之外),标记或枚举的成员。 因此typedef int; 和typedef struct {int bar}; 是非法的,因为他们没有声明声明者,标签或枚举成员。 另一方面,在我看来, typedef struct foo {int bar;}; 是合法的,因为它确实声明了一些东西。 特别是,它声明并定义了struct标签foo 。 […]

为什么结构名称应该有typedef?

我已经看到源代码总是有一个结构的typedef并使用相同的地方而不是直接使用结构名称作为“struct sname”等? 这背后的原因是什么? 这样做有什么好处吗?

嵌套的struct变量初始化

如何在C中初始化此嵌套结构? typedef struct _s0 { int size; double * elems; }StructInner ; typedef struct _s1 { StructInner a, b, c, d, e; long f; char[16] s; }StructOuter; StructOuter myvar = {/* what ? */ };

结构填充是否可以由用户代码安全使用?

假设我有一个如下所示的结构: struct Struct { char Char; int Int; }; 和sizeof( int )大于1并且编译器为Char成员变量添加填充 – 编译器生成的代码是否允许更改填充字节的值? 我的意思是,如果我使用指针运算并将一些数据写入Char成员变量周围的填充字节,然后执行variable.Char =赋值,编译器生成的代码是否也可能会覆盖某些填充字节?

别名结构和数组符合方式

在ISO C之前的日子里,下面的代码会让人惊讶: struct Point { double x; double y; double z; }; double dist(struct Point *p1, struct Point *p2) { double d2 = 0; double *coord1 = &p1.x; double *coord2 = &p2.x; int i; for (i=0; i<3; i++) { double d = coord2[i] – coord1[i]; // THE problem d2 += d * d; return sqrt(d2); […]

取消引用NULL指针是否保证在C / C ++中崩溃程序?

我遇到了这个有线代码而且没有崩溃。 #include struct s { char* c; char* c2; }; int main() { struct s* p = NULL; printf(“%d\n”, &(p->c)); printf(“%d\n”, &p->c2); printf(“%d\n”, &(*p).c2); return 0; } 输出: 0 4 4 我有几个问题来找我,我无法回答: 在c / c ++中,NULL指针总是等于0吗? 如果0恰好是变量的地址会发生什么? 输出似乎是结构成员的偏移地址。 这是如何计算的。 我的意思是p-> c是c的地址,它不存在,因为p == NULL。 如果c的地址不存在,为什么你可以通过&p-> c得到地址c? 取消引用NULL指针是否保证在C / C ++中使程序崩溃?(让我们假设在系统中)

是否可以在运行时更改结构的定义?

我不知道为什么你会想要这样做,但我很好奇是否有人知道答案。 是否有可能在运行时使用一个结构定义一段时间,然后更改该定义? 即 typedef struct { int a; int b; }my_struct; 后来…… typedef struct { int a; int b; int c; }my_struct;