Tag: 结构

指向另一个结构的指针,从文件中写入和读取它会产生SegFault

我正在从学习C The Hard Way中刷出我的C技能,目前我正在进行第17次练习 。 我正在做“额外积分”部分。 使该页面上给出的数据库代码得到我正在尝试 “更改代码以接受MAX_DATA和MAX_ROWS的参数,将它们存储在Database结构中,并将其写入文件,从而创建一个可以任意resize的数据库” 所以,我注释掉#define指令,并更改了给定的地址和数据库结构: struct Address { int id; int set; char *name; char *email; }; struct Database { int MAX_DATA; int MAX_ROWS; struct Address *rows; }; 这样,我可以从用户那里获得MAX_DATA和MAX_ROWS参数,以根据自己的喜好创建数据库。 我在代码中更改的其他内容是 – Database_create函数: void Database_create(struct Connection *conn, int MAX_DATA, int MAX_ROWS) { int i = 0; conn->db->MAX_DATA = MAX_DATA; conn->db->MAX_ROWS = MAX_ROWS; […]

如何用?初始化结构数组?

struct SampleStruct { int a; int b; float c; double d; short e; }; 对于像这样的数组,我曾经用它初始化如下: struct SampleStruct sStruct = {0}; 我想知道当我声明这个结构的数组时,我认为这是正确的 struct SampleStruct sStructs[3] = {{0},{0},{0}}; 但是,下面也被编译器接受了 struct SampleStruct sStructs[3] = {0}; 我想知道最好,最安全的方法和详细原因。

循环并将数据分配给结构成员的宏错误地将结构成员识别为指针

我的问题是atoi正在将字符串的hex内存地址转换为十进制,而不是字符串中包含的内容。 它是在宏中执行此操作。 当宏定义使它成为int时,为什么将struct-> member解释为指针? 下面的伪代码: if (struct.member == int)? struct.member = atoi(data) : struct.member = data; 该程序的这一部分的目的是从包含有关结构属性的信息的.csv文件中检索数据。 我可以接受一个“id”并将每个单元格字符串存储到一个字符串数组(csvRowSplit)中。 但是,我想将数组的内容传输到包含不同数据类型的结构(我想用来检索玩家保存的属性,攻击方法,商店物品等的方法)。 硬编码很容易: opponent->att = atoi(csvSplitRow[0]); opponent->= atoi(csvSplitRow[1]); opponent->hitpoints = atoi(csvSplitRow[2]); opponent->description = csvSplitRow[3]); 然而,这种结构成分更多,并且不是非常灵活或可重复。 我已经定义了一个宏来循环遍历结构的元素,并将csvSplitRow []与变量配对,如果需要转换为atoi。 #define X_FIELDS \ X(char*, description, “%s”) \ X(int, xpreward, “%d”) \ X(int, att, “%d”) \ /* … */ X(int, crit, “%d”) […]

getaddrinfo addrinfo导致堆栈或堆

至少我有点困惑。 getaddrinfo()调用’updates’指向addrinfo结构的指针,当我要在相同的范围(该函数)中使用addrinfo时,一切都很好但是如果我将结构复制到另一个(通过分配它)会发生什么。 请帮助我理解正在进行的基础知识(不寻求替代方法的建议)。 如果我错了,请纠正我:a)getaddrinfo()需要指向addrinfo的struct-pointer的指针。 b)getaddrinfo在当前函数作用域中创建addrinfo结构并更新a)中所需的指针 现在我真正的问题是:我想将addrinfo存储在其他地方。 使用分配给另一个指针不会执行深层复制,并且在该函数之后所有指针都变为无效? 最好给出一个非常简单的例子: void GetAddrInfo(struct addrinfo *update) { struct addrinfo *res; getaddrinfo(xx,xx,xx,&res); //is this save? After this ‘scope’ ends all pointed fields are invalid? //this doesn’t copy the linked list ai_next. *update=*res; } 直接使用和更新getaddrinfo似乎不起作用,因为问题仍然存在:原始结构在函数范围结束后被销毁。 任何人都可以在这里给我更多的见解(请解释在哪里创建的内容和销毁位置,堆栈,堆欢迎所有信息)

传递包含C和C#之间结构数组的结构(DLL和P调用)

我有一个复杂的结构C dll我真的是C#的新手: typedef struct { int a; int b; } simple_struct; typedef struct { int d; int e; simple_struct f[20]; short g; simple_struct h[20]; short i; } complex_struct; 问题是我无法使用这种结构连接我的C#应用​​程序! 在DLL中有一个函数Ge​​tData(complex_struct * myStruct),我应该从C#中调用它,所以我创建了: [StructLayout(LayoutKind.Sequential, Pack = 1)] unsafe struct simple_struct { public int a; public int b; } ; [StructLayout(LayoutKind.Sequential, Pack = 1)] unsafe struct complex_struct […]

对于结构变量,为什么初始化器{21,19,3.6}与{{21,19},3.6}相同,但反之亦然?

在下面的例子中,我用两个结构test1和test2来说明这个。第一个有两个元素 – 一个大小为2的整数数组,和一个浮点元素。第二个结构有3个元素,2个整数和1个浮点数。 我为test1初始化了两个结构变量s1和s2 : s1={{23,52},2.5},s2={21,19,3.6}; 两者都工作正常,即使对于s2我已经取出括起数组元素的大括号。它没有警告工作正常,输出正确。但是当我为test2初始化2个变量时如下: v1={{23,52},2.5},v2={21,19,3.6}; 当我尝试打印出v1的值时输出不正确,这些是我在编译时得到的警告: warning: braces around scalar initializer| warning: (near initialization for ‘v1.list1’)| warning: excess elements in scalar initializer| warning: (near initialization for ‘v1.list1’)| ||=== Build finished: 0 errors, 4 warnings ===| 基于此前提,请清除以下产生的疑问: 问题:如果使用v1={{23,52},2.5}而不是v1={23,52,2.5}会使编译器混淆前两个数字是结构的不同整数元素还是整数数组元素的一部分结构,那么为什么不使用s2={21,19,3.6}而不是s2={{21,19},3.6}混淆编译器认为结构varialbe s2有3个元素(2个整数元素和1个浮动),而不是2个元素(一个大小为2的整数数组和一个浮点数)?我特别想了解的是为什么关于v1的初始化的第一个案例是错误的。 #include struct test1{ int list[2]; float rate; }s1={{23,52},2.5},s2={21,19,3.6}; //Works fine struct test2{ int list1; […]

C中的结构和联合,确定大小和访问成员

所有, 这是一个关于联盟的例子,我觉得这很令人困惑。 struct s1 { int a; char b; union { struct { char *c; long d; } long e; }var; }; 考虑到char是1个字节, int是2个字节, long是4个字节。 这里整个结构的大小是多少? 联合大小是{size of char *} + {size of double}? 我很困惑,因为在union中包含了struct。 另外,如何访问struct中的变量d 。 var.d ?

将结构成员NAME传递给C中的函数?

有没有简单的方法将结构成员的名称传递给C中的函数? 例如,如果我想要实现这一点: (我知道代码不正确,我只是写它来解释这个问题) struct Test { int x; int y; }; int main() { struct Test t; tx = 5; ty = 10; example(t, ); } void example(struct Test t, ) { printf(“%d”, t.); }

结构内存分配

struct node{ int data; struct node * next; }; 当我们尚未为结构“struct node”分配内存时,编译器如何为“next”成员分配内存

struct C中的“:”是什么意思

可能重复: ‘unsigned temp:3’是什么意思 struct Test { unsigned a : 5; unsigned b : 2; unsigned c : 1; unsigned d : 5; }; Test B; printf(“%u %u %u %u”, Ba, Bb, Bc, Bd); // output: 0 0 0 0 static struct Test A = { 1, 2, 3, 4}; 有人可以解释一下我的目的是什么:在struct中, printf只输出0所以我认为这些不是默认值,但它们是什么呢? 也有人可以解释我为什么Aa, Ab, Ac, Ad输出Aa, […]