Tag: struct

结构零初始化是否保证擦除填充区域?

假设我有以下结构: typedef struct { unsigned field1 :1; unsigned field2 :1; unsigned field3 :1; } mytype; 前3位可用,但sizeof(mytype)将返回4 ,这意味着29位填充。 我的问题是,标准保证的这些填充位是否由语句初始化为零: mytype testfields = {0}; 要么: mytype myfields = {1, 1, 1}; 这样可以安全地执行以下memcmp() ,假设位4..29为零,因此不会影响比较: if ( memcmp(&myfields, &testfields, sizeof(myfields)) == 0 ) printf(“Fields have no bits set\n”); else printf(“Fields have bits set\n”);

在C中明显的NULL指针取消引用实际上是指针算术吗?

我有这段代码。 它似乎在这里取消引用空指针,但随后使用unsigned int对结果进行按位与运算。 我真的不明白整个部分。 它打算做什么? 这是指针算术的一种forms吗? struct hi { long a; int b; long c; }; int main() { struct hi ob={3,4,5}; struct hi *ptr=&ob; int num= (unsigned int) & (((struct hi *)0)->b); printf(“%d”,num); printf(“%d”,*(int *)((char *)ptr + (unsigned int) & (((struct hi *)0)->b))); } 我得到的输出是44.但它是如何工作的?

我们可以使用static_assert来检测结构中的填充吗?

这是对另一个问题的后续行动 我试图在编译时建立一个特定的实现是否在结构中添加了未命名的填充。 像gcc这样的特定实现允许使用pragma来控制结构中的填充和对齐,但代价是与其他实现的兼容性。 由于C11的n1570草案都需要static_assert和offset_of ,我想使用它们来查看实现是否在成员之间使用了填充。 以下是代码的相关部分(引用问题中的完整代码): #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; … 正如6.7.2.1结构和联合说明符§15所说: 在结构对象中,非位字段成员和位字所在的单元具有按声明顺序增加的地址。 指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。 结构对象中可能存在未命名的填充,但不是在其开头。 我假设如果结构中元素的偏移量是在它之前声明的元素的大小的总和,那么这些元素之间不存在填充,并且它们应该连续分配,从而如果它们是相同类型则构成数组。 问题是:上述假设是错误的,它是(对参考问题的评论让我们思考)为什么?

严格别名和叠加inheritance

考虑以下代码示例: #include typedef struct AA; struct A { int x; int y; }; typedef struct BB; struct B { int x; int y; int z; }; int main() { B b = {1,2,3}; A *ap = (A*)&b; *ap = (A){100,200}; //a clear http://port70.net/~nsz/c/c11/n1570.html#6.5p7 violation ap->x = 10; ap->y = 20; //lvalues of types int and […]

如何将C-struct指定的初始化程序重写为C89(resp MSVC C编译器)

伙计们,我有这个问题: 通常在C99 GCC(cygwin / MinGW / linux)中,C struct中的初始化器有点符号语法。 像这样: //HELP ME HOW TO REWRITE THIS (in most compact way) to MSVC static struct my_member_t my_global_three[] = { {.type = NULL, .name = “one”}, {.type = NULL, .name = “two”}, {.type = NULL, .name = “three”}, }; 将my_memeber_t定义在头文件中: struct my_member_t { struct complex_type * type; char […]

如何在C中将struct转换为char数组

我正在尝试将结构转换为char数组以通过网络发送。 但是,当我这样做时,我从char数组得到了一些奇怪的输出。 #include struct x { int x; } __attribute__((packed)); int main() { struct xa; ax=127; char *b = (char *)&a; int i; for (i=0; i<4; i++) printf("%02x ", b[i]); printf("\n"); for (i=0; i<4; i++) printf("%d ", b[i]); printf("\n"); return 0; } 这是各种ax值的输出(在使用gcc的X86上): 127: 7f 00 00 00 127 0 0 0 128: ffffff80 00 […]

将C ++类转换为C结构(以及更高版本)

过去几天我一直在“降级”> 1000个C ++代码到C语言。直到现在一直很顺利。 突然间我和一个class级面对面…… 编译器首先在头文件中指出了错误: class foobar { foo mutex; public: foobar() { oneCreate(&mutex, NULL); } ~foobar() { oneDestroy(mutex); mutex = NULL; } void ObtainControl() { oneAcquire(mutex); } void ReleaseControl() { oneRelease(mutex); } }; 当然,C文件必须利用这一点 foobar fooey; fooey.ObtainControl(); 我甚至不知道从哪里开始….帮助?

C编程链接列表删除位置N处的节点

编辑:找出问题所在。 此外,如果你通过谷歌或其他搜索引擎发现这是我出错的地方以及如何解决它。 我的deleteNode()方法正确地使用正确的temp移动列表并保持头部不变。 我出错的地方是因为该方法的结果我正在返回。 我正在返回temp或newNode,这是不正确的,因为它通过列表直到找到定义的位置。 一旦找到定义的位置,它就会重新分配 – > next指针指向next-> next>指针,这是正确的,但我又回到了错误的位置。 因为我们使用temp / NewNode移动了列表,所以我们丢失了标题,我们返回了我们找到的位置以及列表中下一个位置的任何位置。 我们如何解决这个问题就是返回头部(这是传递给方法的内容)。 这之所以有效,是因为我们必须了解LinkedLists的工作原理。 每个节点的指针指向下一个节点。 防爆。 我们有一个链表| A | | – | B | | – | C | | – | D | | – | E | | – | F | | 如果我们要删除Node C,我们使用temp指针移动到节点B,然后在temp-> next-> next旁边分配B->从而跳过C节点并分配D节点。 注意:(据我所知,这实际上并没有释放C节点的内存,所以这不是最佳实践,因为你可以通过这种方式导致内存泄漏)你应该在C节点上使用free()方法。 这是我最终使用的代码 struct node* DeleteNode(struct […]

C中全局结构的成员是否初始化为零?

C中的全局或静态结构的成员是否保证自动初始化为零,与未初始化的全局变量或静态变量相同?

C – 初始化结构数组

我在初始化结构数组时遇到问题。 我不确定我是否做得对,因为我得到“从不兼容的指针类型初始化”和“从不兼容的指针类型分配”。 我在代码中添加了这些警告,当我尝试从结构中打印数据时,我只是得到垃圾,例如@@ ### typedef struct { char* firstName; char* lastName; int day; int month; int year; }student; //初始化数组 student** students = malloc(sizeof(student)); int x; for(x = 0; x < numStudents; x++) { //here I get: "assignment from incompatible pointer type" students[x] = (struct student*)malloc(sizeof(student)); } int arrayIndex = 0; //添加struct //create student struct //here […]