Tag: struct

C中的链表排序

我正在为我的一个类编写一个简单的文件,这是一个简单的链表活动,我需要对链表进行排序。 到目前为止这是我的源代码: /* * Simple list manipulation exercise. * 1. Create a list of integers. * 2. Print the list. * 3. Sort the list. * 4. Print the list * 5. Free the list nodes. */ #include #include struct node { int value ; struct node *next ; } ; extern struct node *mk_node(int […]

从pop函数返回错误的地址

解决了我的结构的其他问题后,我的推送按预期工作,但是我的pop返回错误的地址,我不知道为什么 – QNode* const Q_Pop(Q* const pointerQ){ … // empty check QNode* tempNode = pointerQ->front.next; pointerQ->front.next = (tempNode->next); tempNode->next->prev = &(pointerQ->front); return tempNode; } 我相当确定我的实际删除和重新链接堆栈的逻辑是正确的但我使用指针并返回它们是混乱的。 结构 – struct QueueNode { struct QueueNode *prev; /* Previous list element. */ struct QueueNode *next; /* Next list element. */ }; typedef struct QueueNode QNode; struct Queue { QNode […]

struct变量初始化

我尝试初始化struct变量如下: struct Abc{ char str[10]; }; int main(){ struct Abc s1; s1.str=”Hello”; //error } 我可以理解这种行为,因为它与…相同 char str[10]; str=”Hello”; // incompatible types 但请看下面的初始化 struct Abc s1={“Hello”}; //This is fine struct Abc s2={.str=”Hello”}; //This is also fine 我记得在gradle时,我读了很多教科书,上面说这两个初始化都是同一个东西(即使用{}表示法初始化结构变量,并明确地使用(。)运算符是相同的事情)。 但上面的讨论certificate它们并不相同。 我的问题是这些初始化之间究竟有什么区别?

将char指针编写为文件问题的结构成员

我有一个struct成员作为char *并将其分配给结构初始化的字符串文字“John”,如下所示。 字符串打印精细与printf。 但是,如果我使用fwrite将此字符串写入文件,则在文件中我读回垃圾。 如果我使用char数组而不是char *(如图所示在结构中注释掉),并将其写入文件,我可以按预期读回文件中的字符串。 我无法理解这一点。 在两种情况下都不应该使用指针并将正确的字符串写入文件? 此外,如果我声明一个单独的char *并将其指向字符串文字并将其写入文件,我可以按预期读回。 非常感谢您提供任何解释方面的帮助。 (我在Windows上使用带有Mingw编译器的codeblocks IDE)。 更新:包括使用的实际代码 int main() { struct person { //char name[20]; char* name; int age; }; struct person p1 = {“John”, 25}; printf(“%s\n”, p1.name); FILE* fp = fopen(“test.txt”, “w”); fwrite(&p1, 1, 10, fp); return 0; }

如何qsort使用结构的指针数组?

我想按Id的顺序排列一系列指针。 但是由于我缺乏指针经验,qsort无法工作。 typedef struct block{ int Id; char * name; } block; typedef struct { block ** data; int size_array; } database; if( ( database = malloc(sizeof(database)) ) == NULL ) { printf(“Error: malloc failed\n”); exit(EXIT_FAILURE); } if( ( database->data = malloc( sizeof( block * ) * database->size_array ) ) == NULL ) { exit(EXIT_FAILURE); […]

如何在全局范围内初始化struct / class

我现在知道如何在全局范围内初始化结构。 以下是示例代码: #include struct A { int x; }; struct A a; ax=6; int main() {} 我在Ubuntu 11.10上,当我编译这个程序时,我收到以下错误: error: ‘a’ does not name a type 我不知道为什么会发生这种情况。 我想知道如何将复杂参数传递给某些回调函数? 非常感谢

如何使用fwrite将结构写入文件?

我对C很新,我遇到了fwrite问题。 我想使用一个包含两个值的结构: struct keyEncode{ unsigned short key[2]; unsigned short encoded[2]; }; 然后我在我的main中声明我的struct和指向该struct的指针: struct keyEncode keynEncode; struct keyEncode *storedVal = &keynEncode; 然后我为结构赋值,并希望使用fwrite将结构写入文件: keynEncode.key[0] = k1[0]; keynEncode.key[1] = k1[1]; keynEncode.encoded[0] = p[0]; keynEncode.encoded[1] = p[1]; // i tried to use storedVal.key[0] = k1[0]; but i was getting compile errors fwrite(storedVal, sizeof(storedVal), 0xffff, fp); 现在我的问题是fwrite没有写任何文件。 我哪里错了?

需要改变不同结构中的常见字段

对于Windows和各种Unix平台,我在这里用C编程。 我有一组具有共同字段的结构,但也有不同的字段。 例如: typedef struct { char street[10]; char city[10]; char lat[10]; char long[10]; } ADDR_A; typedef struct { char street[10]; char city[10]; char zip[10]; char country[10]; } ADDR_B; 它们显然不是那么简单,我实际上有6种不同的结构,但这是基本的想法。 我想要的是一个函数,我可以将指针传递给其中一个并能够更新公共字段。 就像是: static void updateFields( void *myStruct ) { strcpy( myStruct->street, streetFromSomethingElse ); strcpy( myStruct->city, cityFromSomethingElse ); } 显而易见,我在那里写的东西不起作用,因为void指针和某种类型的强制转换是有序的,但是没有一个很好的方法来强制转换(是吗?)。 我并不反对以某种方式指定结构类型的附加参数。 由于不相关的原因,我不能更改这些结构或将它们组合或用它们做任何其他事情。 我必须按原样使用它们。 一如既往,感谢您的帮助。 编辑:正如我在下面的评论中添加的那样,公共字段不保证全部在开头或全部在结尾或其他任何内容。 他们只是保证存在。

在C中键入命名空间

我已经在SO中读到了C中定义类型的不同命名空间,例如,Structs和Unions有一个命名空间,typedef有一个命名空间。 命名空间是这个的确切名称吗? C中存在多少个命名空间?

对堆上结构使用struct初始化语法

我有这个简单的结构,我想在堆上初始化并作为函数中的指针返回。 struct entry { const char* const key; // We don’t want the key modified in any way const void* data; // But the pointer to data can change struct entry* next; }; 有一个问题,我不能calloc它并逐个初始化成员因为key是一个const指针。 我找到了一个有效的语法: struct entry* entry = calloc(1, sizeof(struct entry)); *entry = (struct entry) { .key = key, .data = data, .next = […]