Tag: 结构

什么时候不应该使用#pragma pack?

在C中,当我们使用结构时,何时使用#pragma pack指令是不合适的? 问题的补充…… 有人可以解释更多关于如何使用指针访问未对齐数据失败?

排序结构数组的成员

给定一个结构数组(在C中)我试图以数字顺序打印出性别组和子顺序的结果。 例如: struct employee{ char gender[13] char name[13]; int id; }; 假设我像这样定义结构数组: struct employee info[2]={{“male”,”Matt”,1234},{“female”,”Jessica”,2345},{“male”,”Josh”,1235}}; 我怎么能打印结果像 1234 Matt 1235 Josh 2345 Jessica

关于默认的C struct值,这段代码怎么样?

我正在尝试使用默认值创建结构。 我不知道如何实现这个目标,因为我看到的每个代码都是关于初始化的,我会以自然的方式来做… struct stuff { int stuff_a = 1; int stuff_b = 2… …and so on… }; 看,我发现这个(C ++)代码: struct a{ a() : i(0), j(0) {}; INT i; INT j;} 我从来没有为C看过这样的事。请帮我理解一下; 我觉得这很好! 更新:等等,我问的是C !!!! 为什么改变我的问题? 如果在C中这是不可能的,那就说……我不懂C ++,我不知道那是关于C ++的……

在Trie Structure字典中添加单词

我正在尝试创建一个可以插入单词的trie结构,但结构必须完全像这样: typedef struct tNode_t { struct tNode_t **l; char *w; } tNode; **l是指向tNode的27个指针数组的指针,这是我不理解的部分。 如果数组是指向tNode的指针,我该如何在其中插入单词? 并且由于数组的大小是27(26个小写字母az和终止字符),你怎么知道输入单词的位置取决于起始字母是什么?

为什么在这种情况下不会发生填充?

据我所知,默认情况下将完成4字节对齐。 说 typedef struct { int data7; unsigned char data8; //3 -bytes will be added here. }Sample1; sizeof(Sample1)将为8。 但对于以下结构,为什么没有发生填充? typedef struct { unsigned char data1; unsigned char data2; unsigned char data3; unsigned char data4; unsigned char data5; unsigned char data6; }Sample2; 但sizeof(Sample2)仅为6。 Sample2不是4字节对齐的结构? 编辑:: 按照Wiki 数据对齐意味着将数据放入存储器偏移量等于字大小的某个倍数,这会因CPU处理内存的方式而提高系统性能。 但Sample2的成员不会以两个的倍数对齐? 谢谢。

在此C程序中返回结构时出错的原因是什么?

我的计划打算实现这一目标 (A)编写一个名为larger()的C函数,它返回传递给它的任何两个日期的后期日期。 例如,如果将日期10/9/2001和11/3/2001传递给greater larger() ,则将返回第二个日期。 (B)在完整单元中创建为(A)编写的large()函数。 将large()返回的日期结构存储在单独的日期结构中,并显示返回的数据结构的成员值。 我正在为我的C语言课程研究这个问题。 我一切顺利(我想),除了我不断得到“更大的日期是:0/0/0”,无论我输入什么。 所以我开始修补,现在我无法摆脱语法错误,或弄清楚我的0/0/0问题。 显然日期并没有让它重新开始。 我对此仍然很陌生(并且在结构上非常新),所以任何帮助都会很棒! 给我语法错误的行靠近main()的底部: DATES result[NUM] = larger(DATES user[NUM]); 代码全部: #include #define NUM 2 struct Dates { int month; int day; int year; }; typedef struct Dates DATES; DATES larger(DATES[NUM]); DATES more; int main() { DATES user[NUM]; printf(“You will enter two dates, and the program will […]

是否可以将结构转换为另一个?

任何人都可以描述(struct sockaddr *)&server如何在这里工作? 是否有可能将更大的结构转换为更小的结构? 看到这些结构: // IPv4 AF_INET sockets: struct sockaddr_in { short sin_family; // eg AF_INET, AF_INET6 unsigned short sin_port; // eg htons(3490) struct in_addr sin_addr; // see struct in_addr, below char sin_zero[8]; // zero this if you want to }; struct in_addr { unsigned long s_addr; // load with inet_pton() }; struct sockaddr […]

初始化非常大的结构的正确方法是什么?

在我们的代码中,我们曾经有这样的事情: *(controller->bigstruct) = ( struct bigstruct ){ 0 }; 这曾经很好用,然后我们升级了GCC版本并突然开始看到堆栈溢出。 看看程序集,旧的GCC代码(2.x)基本上是这样做的: memset(controller->bigstruct, 0, sizeof(struct bigstruct)); 新的GCC(3.4.x)正在这样做 struct bigstruct temp = { 0 }; controller->bigstruct = temp; 在审查了C99规范后,我明白了为什么; C99基本上要求堆栈上存在匿名结构。 这是一个很好的概念,但是这个结构大了4兆字节,并且只能在堆上存在! 我们已经使用了我们自己的“初始化”function来明确设置成员,但这很丑陋并且是一个维护问题。 我不认为memset是一个合适的解决方案,因为我不知道0的位值是该类型的适当零值(我知道,但是你知道,但是你有;我不介意编译器做到了,因为它可以知道) 初始化像这样的大型结构的“正确”或至少是最好的方法是什么? 为了进一步阐明我认为memset不是解决方案的原因:未明确初始化的成员的初始化规则与静态初始化相同,如下所示: – 如果它有指针类型,则初始化为空指针; – 如果它有算术类型,则初始化为(正或无符号)零; … ‘memset’会将内存设置为位模式零,这不一定是一回事。 想象一下不使用IEEE浮点数的系统。 不寻常,但由C支持.0.0的表示不一定意味着“全位为零”,它可以是处理器的任何方便。

将结构分区为私有和公共部分?

在C ++和Java中,数据结构可以包含private , public和protected区域。 我想将这个概念移植到我正在编写的C语言程序中。 是否有任何习惯用于在C struct实现私有或受保护的函数指针和数据字段? 我知道C struct是公共的,我正在寻找一个成语来帮助隐藏一些实现细节并强迫用户使用公共接口。 注意:该商店已选择该语言,因此我无法将面向对象的概念应用到C. 谢谢。

使用多个排序条件对数组进行排序(QuickSort)

我试图找出(使用快速排序算法)如何通过2个标准对结构数组进行排序。 比如说我有一个结构: struct employee{ char gender[12]; char name[12]; int id; }; 说我的输入是: struct employee arr[3]= { {“male”,”Matt”,1234}, {“female”,”Jessica”,2345}, {“male”,”Josh”,1235} }; 我想先按性别对元素进行排序,然后按升序对ID进行排序。 一个例子是,所有的男性首先打印出他们的ID,然后是所有的女性。 我试图这样做而不使用qsort函数,但我没有丝毫想法如何检查。 这是我的排序function: void quicksort(struct employee *arr, int left, int right) { int pivot, l, r, temp; if(left < right) { p = left; l = left; r = right; while(l < r) { […]