Tag: struct

如何释放仅包含指针的结构

我有一个结构,你在下面看到: typedef struct _List { Person *person; // pointer for people list DoList *do; // Kinda timer, for checking list in some intervals } List; 有没有必要释放这个结构? 如果是这样,我怎么能免费呢?

__attribute __((packed))对嵌套结构数组的影响?

问题 我正在努力通过网络将原始结构发送到另一端的已知程序,但不得不担心用于对齐结构的静默引入的内存(其他问题,如字节顺序被覆盖)。 我正在使用的是: typedef struct __attribute__((packed)) { uint16_t field1; uint16_t field2; uint16_t field3; } packed_1_s; typedef struct __attribute__((packed)) { uint16_t fieldA; uint16_t fieldB; packed_1_s structArray[10]; } packed_2_s; typedef struct __attribute__((packed)) { uint16_t fieldX; packed_2_s fieldY; uint8_t arrayZ[20]; } data_s; 我理解通常,packed_1_s结构可以/将为结构的每个实例分配额外的空间,以将其填充到编译器的优选大小(取决于它所构建的硬件),并且有利的大小可以是2个字节的任何位置到64个字节(最近)。 通常情况下,如果我在packed_2_s中有一个packed_1_s的实例就没有问题,但是当我尝试将元素放入数组时,我会理解它们存在一些差异。 试图解决方案 gcc文档似乎建议通过简单地在packed_2_s定义中包含packed属性,即使它们是数组,这些字段也将尽可能紧密地包装,并且不会为packed_2_s结构添加空间以对齐元素数组。 关于align()属性的文档虽然表明数组的处理方式与其他字段不同,但需要在字段上直接设置align / packed属性,以便修改添加的额外间距以匹配指定的对齐(或缺少对齐)。 我尝试在structArray字段上设置packed属性,当它不起作用时,通过在上面的代码中设置arrayZ上的packed属性进行测试: packed_1_s structArray[10] __attribute__((packed)); uint8_t arrayZ[20] __attribute__((packed)); 两次尝试都给了我一个编译器警告,在这个上下文中没有理解packed属性并且会被跳过(我用“-Wall”构建的好东西)。 我希望绕过这个问题的方法是使用属性align(1),指示1字节的所需对齐,这与packed属性相当,但是文档说align()属性只能增加对齐和打包应该用于减少对齐。 […]

是否使用未定义所有成员的结构未定义?

在块范围内考虑此代码: struct foo { unsigned char a; unsigned char b; } x, y; xa = 0; y = x; C [N1570] 6.3.2.1 2说“如果左值指定了一个自动存储持续时间的对象,该对象可以用寄存器存储类声明(从未使用过它的地址),并且该对象未初始化(未使用初始化程序声明)在使用之前没有对它进行任何分配),行为是不确定的。“ 尽管已为x的成员分配了值,但未执行对x赋值,并且未对其进行地址处理。 因此,看起来6.3.2.1 2告诉我们y = x中x的行为是未定义的。 但是,如果我们为x每个成员分配了一个值,那么考虑到为了6.3.2.1 2而未初始化x似乎是不合理的。 (1)严格来说,标准中是否有任何内容导致6.3.2.1 2不适用于(未定义)上述代码? (2)假设我们正在修改标准或确定对6.3.2.1的合理修改2,是否有理由偏好以下其中一项而不是其他? (a)6.3.2.1 2不适用于结构。 (b)如果一个结构的至少一个成员被赋予了一个值,则该结构在6.3.2.1的目的下不是未初始化的。(c)如果一个结构的所有已命名的1个成员都被赋予了一个值,那么该结构是为6.3.2.1的目的而未初始化2。 脚注 1结构可能具有未命名的成员,因此并不总是可以为结构的每个成员分配值。 (即使结构初始化,未命名的成员也具有不确定的值,每6.7.9 9.)

所有指针都是从指向结构类型的指针派生的吗?

问题 是否所有指针都是从指向结构类型的指针派生的问题都不容易回答。 我认为这是一个重要问题,主要有以下两个原因。 A.缺少指向“任何”不完整或对象类型的指针,对方便的函数接口施加了限制,例如: int allocate(ANY_TYPE **p, size_t s); int main(void) { int *p; int r = allocate(&p, sizeof *p); } [ 完整代码示例 ] 指向“任何”不完整或对象类型的现有指针明确描述为: C99 §6.3.2.3 p1 : 指向void的指针可以转换为指向任何不完整或对象类型的指针。 […] 从指向“任何”不完整或对象类型的现有指针派生的指针,指向void的指针,严格地是指向void的指针,并且不需要使用从指向“任何”不完整的指针派生的指针进行转换或对象类型。 B.程序员根据他们对特定实现的经验,使用基于不需要的假设的约定,有意或无意地与指针的泛化相关,这种情况并不少见。 假设,例如可转换,可表示为整数或共享公共属性:对象大小,表示或对齐。 标准的话 根据C99 §6.2.5 p27 / C11 §6.2.5 p28 : […]所有指向结构类型的指针应具有相同的表示和对齐要求。 […] 其次是C99 TC3 Footnote 39 / C11 Footnote 48 : 相同的表示和对齐要求意味着可互换性作为函数的参数,函数的返回值和联合的成员。 […]

为什么fread会弄乱我的字节顺序?

我试图用fread()解析一个bmp文件,当我开始解析时,它会反转我的字节顺序。 typedef struct{ short magic_number; int file_size; short reserved_bytes[2]; int data_offset; }BMPHeader; … BMPHeader header; … hex数据是42 4D 36 00 03 00 00 00 00 00 36 00 00 00 ; 我通过fread(&header,14,1,fileIn);将hex数据加载到struct中fread(&header,14,1,fileIn); 我的问题是幻数应该是0x424d //’BM’ ()它将字节翻转为0x4d42 // ‘MB’ 为什么fread()会这样做,我该如何解决它; 编辑:如果我不够具体,我需要将整个hex数据块读入结构,而不仅仅是幻数。 我只选择了幻数作为例子。

C中的N-ary树

哪个是用C语言实现N-ary树的巧妙实现? 特别是,我想实现一个n-ary树,而不是自我平衡,每个节点中有一个未绑定数量的子节点,其中每个节点都包含一个已定义的结构,例如: struct task { char command[MAX_LENGTH]; int required_time; };

为什么GCC填充这个位域?

程序在C中使用std = c99,这是在64位机器上。 struct epochs { volatile unsigned int epoch : 1; volatile unsigned int pulse : 1; volatile unsigned int active0 : 7; volatile unsigned int active1 : 7; volatile unsigned int counter0 : 24; volatile unsigned int counter1 : 24; }; 当我检查sizeof(epochs)它给了我12。 我可以告诉gcc不要通过添加__attribute((packed))来填充它; 所以我可以解决它。 但是我真的想知道为什么要添加4个字节来填充这个64位结构? 这里的主要内容是这个结构需要64位,因为它在64位primefaces交换操作中一次更新,当然这对12字节值不起作用。

struct typedef中的声明规则

我正在阅读’C编程语言’,并遇到了关于struct的 typedef的问题。 代码是这样的: typedef struct tnode *Treeptr; typedef struct tnode { /* the tree node: */ char *word; /* points to the text */ int count; /* number of occurrences */ struct tnode *left; /* left child */ struct tnode *right; /* right child */ } Treenode; 到我们写的时候 typedef struct tnode *Treeptr; tnode仍未声明,但我们没有得到任何编译错误,但是当我们将上面的语句更改为: typedef Treenode […]

在文件范围错误时修改了’variable_name’?

C的新手。编译时出现以下错误: error: variably modified ‘header’ at file scope error: variably modified ‘sequence’ at file scope 码: struct list{ char header[list_header_size]; char sequence[list_sequence_size]; struct list *next; }; 我认为错误意味着编译器需要从一开始就知道这些变量是什么。 因此,我将main()(调用结构的位置)移动到程序的末尾。 我也尝试在程序开始时声明变量,但我不确定我是否正确地执行了此操作。 我试过char header; 和char header[];

如何在C中正确地malloc for struct数组

我将使用strtok读取两组char* (或字符串),并且由于这两组chars是相关的, (address : command\n)我决定使用一个结构。 struct line* array = (struct line*)malloc(sizeof(file) * sizeof(struct line*)); 这个函数的行malloc空间给了我一个分段错误,并想知道你是否可以告诉我一个正确的malloc空间方式。 对于上下文,这是我的其余代码: struct line { char* addr; char* inst; }; while loop{ x = strtok(line,”: “); y = strtok(NULL,”\n”); strcpy(array[i].addr,x); //assume that x and y are always 3characters strcpy(array[i].inst,++y); i++; }