Tag: struct

指向C中的自构造

给出以下代码: typedef struct elementT { int data; struct elementT *next; } element; 为什么有必要做struct elementT *next而且我不能在struct声明本身里面做element *next ? 是因为它还没有申报吗?

使用C解析wtmp日志

对于我们的赋值,我们得到一个wtmp日志的副本,并期望解析它,并以排序的格式输出它,类似于last的输出。 现在,我知道文件wtmp包含一个utmp结构列表。 保证提供的文件至少包含一个utmp结构,我应该假设二进制文件中的所有结构都是正确构造的。 我通过man utmp阅读,并且我已成功编写了一个程序来读取所提供的二进制文件的结构。 (我为漫长的打印方法道歉) #include #include #include #include void utmpprint(struct utmp *log); int main() { int logsize = 10; FILE *file; struct utmp log[logsize]; int i = 0; file = fopen(“wtmp”, “rb”); if (file) { fread(&log, sizeof(struct utmp), logsize, file); for(i = 0; i ut_type, log->ut_pid, log->ut_line, log->ut_id, log->ut_user, log->ut_host, log->ut_exit.e_termination, log->ut_exit.e_exit, log->ut_session, […]

运算符’重载’等效于C / Objective-C中的#define

可能重复: 运算符在C中重载 如果我有一个结构: typedef struct myStruct { … } myStruct; myStruct myStructAdd(myStruct a, myStruct b); 我需要这样的东西: #define myStruct a + myStruct b myStructAdd(a, b) // NOTE this code does NOT WORK. This is what the question is asking. 要使此语法有效: myStruct a; myStruct b; myStruct c = a + b; 有没有办法使用#define来做到这一点? 编辑: 我不是要求+语法的替代品。 我要问的是,是否以及如何使用预处理器在编译时将plus语法重写为标准C语法。 例如#define myStruct […]

函数中的struct指针范围

如果我在函数中有以下内容: struct example *A=malloc(sizeof(struct example)); 节点/内存空间是否在函数结束/离开后A点指向被销毁? 还是它留在堆里?

如何从堆栈中弹出不同类型的结构

我有一个包含两种类型结构的堆栈。 结构螺柱和结构教授当我想要推动某些东西时,我为两个结构创建了两个推送function。 虽然我希望它有一个function,但它可以,我可以忍受它。 现在去Pop。 如果我想从Stack中弹出一个学生,我是否必须专门为学生制作一个Popfunction? 教授一样吗? 如果我不知道它是什么类型,我该如何存储该项目? 元素必须是什么类型,才能将项目存储在那里? 结构如下: struct MyStack { int head; void **stack; int size; }; typedef struct MyStack STACK; struct stud { char flag; char fname[50]; int semester; }; struct prof { char flag; char fname[50]; char course[30]; }; 现在创建Popfunction。 我在函数中传递了什么类型的项目? int Pop(STACK *stack,int *head,??? *elem) { if(stack->headstack[*head]; *head–; return 1; […]

数组结构,结构数组和内存使用模式

我一直在阅读有关SOA的内容,我想在我正在构建的系统中尝试实现它。 我正在编写一些简单的C结构来做一些测试,但我有点困惑,现在我有一个vec3 3个不同的结构。 我将在下面显示它们,然后进一步详细说明这个问题。 struct vec3 { size_t x, y, z; }; struct vec3_a { size_t pos[3]; }; struct vec3_b { size_t* x; size_t* y; size_t* z; }; struct vec3 vec3(size_t x, size_t y, size_t z) { struct vec3 v; vx = x; vy = y; vz = z; return v; } struct vec3_a vec3_a(size_t […]

从32位系统上的结构读取一个long(C)

在C中,我有一个带有成员“frequency”的结构,这是一个长的unsigned int。 此代码运行的硬件是32位。 struct在实例化时设置其值。 struct config_list configuration = { … .frequency = (long unsigned int)5250000000u, … } 在我的代码中,我通过指针将这个结构传递给子程序。 在这个子程序中,我似乎无法获得正确的值,所以要检查,我输入: printf(“Config frequency: %lu\n”, ptr->frequency); printf(“Derefernced: %lu\n”, (*ptr).frequency); 因为这两种方式我认为你可以从指针访问结构数据。 但是,在这两种情况下,我看到的输出是955,032,704。 我认为这只是我设置的频率的前32位。 我的问题是,为什么我的long unsigned int被削减到32位? 是不是“长”应该将范围扩展到64位?

尝试将结构实例写入文件时出现分段错误

我正在尝试将结构写入文件,但在运行时遇到分段错误: #include //just a struct for purposes of demonstration struct my_struct{ int prop1; int prop2; }; //writes dummy struct to filename.dat void writeStruct(){ FILE *file_pointer; file_pointer = fopen(“filename.dat”,”w”); //define and assign variables to a quick dummy struct struct my_struct *this_struct; this_struct->prop1=0; //seg faults here! this_struct->prop2=1; //write struct to file fwrite(this_struct, sizeof(*this_struct), 1, file_pointer); fclose(file_pointer); } […]

Scanf始终跳过第二行输入

我正在尝试读取文本数据行,并将它们存储在链表中。 输入数据看起来像这样: David Copperfield Charles Dickens 4250 24.95 32.95 10 6 END_DATA 我读取数据的方法是首先读取第一行,看它是否是END_DATA。 如果不是,那么我将第一行传递给一个函数,该函数创建一个带有书籍数据的链表Node。 由于某种原因,在我将第一行传递给函数后,scanf不会读取第二行。 当我尝试在读取数据后打印节点时,我的输出看起来像这样。 David Copperfield 0 0.000000 0.000000 0 0 Charles Dickens 4250 24.950001 32.950001 10 6 Charles Dickens 0 0.000000 0.000000 0 0 源代码如下 #include “lab3p1.h” #include #include #include struct NodeRec { Book data; struct NodeRec *next; }; typedef struct NodeRec […]

从结构中的指针获取数据“读/写无效”

我试图在数组中执行循环缓冲区。 我将数据保存在结构中,并通过推送,弹出等方法管理它。程序或多或少具有function和行为符合预期,但是我在valgrind测试中遇到错误。 我无法找出我的代码有什么问题。 虽然看起来像我的结构中通过指针管理数据是关键问题。 如果有人能指出我正确的方向,我将非常感激,因为我现在真的迷失了。 这是我的结构的样子: typedef struct queue_t{ int* data; int* end; int* head; int* tail; int max_length; int cur_length; } queue_t; 以下是我管理缓冲区操作的方法: (注释代码产生与memcpy几乎相同的错误) int* increase(int* point, queue_t* queue){ if(point != queue->end){ point = point + sizeof(int*); return point; }else{ return queue->data; } } queue_t* create_queue(int capacity){ queue_t* fifo; fifo = malloc(sizeof(queue_t)); fifo->data = […]