Tag: 结构

结构数组在排序时给出错误的输出

1)我有一个结构 struct node { char symbol; int freq; int left, right,root; int value; short is_sorted; }; struct node data[1000]; 其中,通过从文件“Input.txt”作为唯一参数读取以下字母符号(符号)(abcdef)值来获得数据[215] .freq(频率){0,1,2,3,4,5}。现在我必须添加这个数组的两个最小频率,然后定位在同一个数组中获得的新元素,这样它将保持freq的增加顺序(它已经是排序数组,见我们有0,1,2,3 ,4,5)。 (2)我还必须注意两个最小添加元素不能再参与分类和添加,如果已经添加它们,它们必须固定在它们的位置一次,但是通过添加新获得的元素可以参与其中再次排序。 例如:我们添加两个最小元素0和1,0 + 1 = 1,因此“1”是通过加法获得的结果,现在这个“1”必须位于data [] .freq中,这样仍然应该有增加的顺序。 所以: data[i].freq = 0 1 1(added here) 2 3 4 5 现在我们必须再次找到最少两个节点(请再次阅读评论(2)以便了解。)我们不能再添加0 abnd 1,因为他们已经参与了添加。 所以这次我们将添加1和2(这个是在索引3,请不要与索引2处的那个混淆)。 所以我们得到1 + 2 = 3 0 1 1 2 3 […]

将指向较大结构的指针转换为指向较小结构的指针

这篇文章将以此为基础,但将更加通用。 通常我会看到指向大型结构的指针被转换为指向较小结构的指针,我认为这是有效的,因为指针只是结构中第一个字节的地址。 我还有一个问题是,当大多数方法没有指向他们期望的类型时,如何处理指针。 我将使用Socket API作为示例: sockaddr_storage比sockaddr但是指向sockaddr指针会被转换为指向sockaddr指针,然后才会传递给sockaddr这样的函数 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 因此,当指针指向比预期更大的结构时,如何处理函数。 他们说 “哦,传给我的大小( socklen_t addrlen )比我想象的要大。最好把这个指针扔回sockaddr_storage !” 然后像这样访问其成员? 或者他们做了更复杂的事情?

结构成员对齐中的混乱

typedef struct structc_tag { char c; double d; int s; } structc_t; 我在博客中读到这将占用24个字节的数据: sizeof(char)+ 7字节填充+ sizeof(double)+ sizeof(int)+ 4字节填充= 1 + 7 + 8 + 4 + 4 = 24字节。 我的问题是为什么7字节填充,为什么我们不能在那里使用3字节填充并使用接下来的8字节为double? 最后4个字节需要什么?

警告:赋值使用整数而不使用强制转换

我正在从指针执行转换然后它让我运行此警告(赋值使得指针来自整数而没有强制转换)。 这是代码: #include #include typedef int TipoChave; typedef struct TipoRegistro { TipoChave Chave; /*outros componentes*/ } TipoRegistro; typedef struct TipoPagina* TipoApontador; typedef struct TipoPagina { int registros; TipoRegistro *r; TipoApontador *p; } TipoPagina; TipoApontador NovaSubArvore(int ordem){ TipoApontador A; A=malloc(sizeof(TipoPagina)); int i; A->registros=0; A->r=malloc((2*ordem)*sizeof(TipoRegistro)); A->p=malloc((2*ordem+1)*sizeof(TipoPagina)); for (i=0;ip[i]=NULL; if(i!=2*ordem){ A->r[i].Chave=0; } } return (A); } 在主要我打电话: TipoApontador […]

结构标签可以在其范围之前使用吗?

在以下示例中: #include #include struct B b; struct B{int a;}; struct B; int main() { ba=3; printf(“%d\n”, ba); return 0; } 结构标记B的文件范围从其第一个定义/声明struct B{int a;}; 。 struct B b;怎么样struct B b; 在B的范围之前参考B没有错误? 是struct B; 结构类型声明或结构类型定义? 为什么它不与其他定义struct B{int a;};冲突struct B{int a;}; 在同一文件范围内?

循环遍历C中结构中的元素,以提取单个元素的值和数据类型

我有一个要求,我在C中有一个很大的结构,包含30多种不同数据类型的不同元素: typedef struct { type1 element1; type2 element2; type3 element3; type2 element4[10]; … typeN elementN; } my_messg_struct; 这基本上是通过串行协议发送的消息中的一组元素。 此消息具有在上述结构中捕获的各种数据类型的元素。 同样,我也有很多其他消息。 现在我必须编写一个generics函数,它负责读取这些消息结构并循环读取元素的值和数据类型的每个元素,然后通过串行端口进行传输。 我需要首先读取数据类型,因为在我的情况下,各种数据类型的传输顺序是不同的。 所以,基本上,我只是想知道如何在C中循环遍历结构的元素,以便我可以读取结构中存在的每个元素的值和数据类型?

strcmpfunction无法正常工作

我在结构books数组上有一个deletefunction 。 我正在传递一系列记录, author of book name of book和size of the list 。 现在这里给出了list[0].author和list[5].author和author all等于“Dan Brown”(同一个字符串) void delete(struct books *list,char author[],char name[],int n) { int i,a; a=strcmp(list[0].author,list[5].author); printf(“%d\n”,a); // prints 0 a=strcmp(list[0].author,author); printf(“%d\n”,a); // prints other than 0 } 为什么会这样? 这有什么不对?

在另一个结构中声明/定义的结构范围

从嵌套结构中读取,我意识到在另一个结构中声明的结构的范围与包含结构相同。 我认为它只包含在包含结构中。 我从这个链接得到了这个印象。 它说有4个名称空间,其中一个是结构的成员。 我“逻辑地”推断内部结构仅限于外部结构。 任何人都可以提供标准的参考,以确定范围规则在这种情况下的确切工作方式吗? 以及允许内部结构在包含结构外可见的任何理由? 如果它是可见的,为什么不在外面声明结构… 问题2 :对于术语,当我提供结构的成员时,比方说 struct out{ int a, b; char c, d; struct in{ int a, b; }e; }; 我是否为struct out和struct in提供了定义 ; 或者我是否为两者提供声明 ? 我理解函数和原始数据类型的区别,但对于struct来说并不是很清楚。 编辑 :我在SO上找到的有用链接: C和C ++中的嵌套结构 。 但它没有提供任何理由。 现在我怀疑是否有一个C …

如果只使用第一个元素,我是否必须为整个结构分配mem?

我有一个结构,其中第一个元素被测试并依赖于它的值,结构的其余部分将被读取或不被读取。 在第一个元素的值指示不读取结构的其余部分的情况下,我是否必须为整个结构或第一个元素分配足够的内存? struct element { int x; int y; }; int foo(struct element* e) { if(e->x > 3) return e->y; return e->x; } 在主要: int i = 0; int z = foo((struct element*)&i); 我假设如果仅为第一个元素分配有效,那么我将不得不警惕任何可能试图复制结构的东西。 即将结构传递给函数。

ISO C禁止在C中使用空的初始化程序括号

我有这样的结构: typedef struct { int a; int b; int c; int d; } Hello; 然后我以这种方式宣布它: Hello hello[6] = {}; 然后我得到了这个警告:ISO C禁止空初始化器括号,无论如何我认为我需要初始化它,如何以正确的方式做到这一点?