Tag: 结构

交换结构数组中的元素

说我有这个结构: struct MyStruct { int iID; int iMyNumber; }; 然后我定义了一个MyStructs数组: struct MyStruct msTest[3]; 我正在通过查看ID对类似于此的结构进行排序操作。 现在,一旦我发现应该交换哪些记录来对数组进行排序,我就必须进行实际的交换。 我试过这个: if (iSmallest != iCntr) { stPTmp = &stXDB[iCntr]; &stXDB[iCntr] = &stXDB[iSmallest]; &stXDB[iSmallest] = &stPTmp; } stPTmp定义为void *stPTmp; 和iCntr和iSmallest包含要交换的记录的索引。 我的代码不起作用,但我该如何解决?

长长的对齐问题(MSVC与GCC)

我正在编写C跨平台库,但最终我的unit testing中出现错误,但仅限于Windows机器上。 我已经跟踪了这个问题并发现它与结构的对齐有关(我正在使用结构数组来保存多个类似对象的数据)。 问题是:memset(sizeof(struct))和设置结构成员逐个产生不同的字节到字节结果,因此memcmp()返回“不相等”的结果。 这里的代码为: #include #include typedef struct { long long a; int b; } S1; typedef struct { long a; int b; } S2; S1 s1, s2; int main() { printf(“%d %d\n”, sizeof(S1), sizeof(S2)); memset(&s1, 0xFF, sizeof(S1)); memset(&s2, 0x00, sizeof(S1)); s1.a = 0LL; s1.b = 0; if (0 == memcmp(&s1, &s2, sizeof(S1))) printf(“Equal\n”); […]

struct function的不兼容返回类型 – C.

当我尝试按原样运行此代码时,我收到编译器消息“错误:返回不兼容的类型”。 我在代码中标记了错误的位置。 如果我把这条线拿出来,那么编译器很高兴。 问题是我想返回一个表示函数无效输入的值(在这种情况下调用f2(2)。)我只想要一个返回数据的结构,如果调用该函数而不使用2作为参数。 我觉得只有两种方法可以: 使函数返回一个结构指针而不是一个死对象结构但是我的调用函数看起来很有趣,因为我必须将yb更改为y-> b,并且由于在内存中获取数据的额外步骤,操作可能会更慢。 分配额外的内存,零字节填充它,并将返回值设置为内存中该位置的结构。 (例如: return x[nnn];而不是return x[0]; )。 这种方法将使用更多的内存和一些处理来零字节填充它。 最终,我正在寻找一种从长远来看最快,最干净(在代码方面)的解决方案。 如果我不得不坚持使用->来解决元素的成员,那么我想这就是要走的路。 有没有人有一个使用最少的CPU功率的解决方案? #include #include #include typedef struct{ long a; char b; }ab; static char dat[500]; ab f2(int set){ ab* x=(ab*)dat; if (set==2){return NULL;} if (set==1){ x->a=1; x->b=’1′; x++; x->a=2; x->b=’2′; x=(ab*)dat; } return x[0]; } int main(){ ab y; y=f2(1); […]

在结构C中初始化变量矩阵

我在C中的结构中初始化变量矩阵时遇到了麻烦。已经阅读了几篇post( post )但我似乎无法修复它。 不要问我为什么,但是对于一项任务,我需要初始化一个位于结构中的矩阵。 我的结构代码是: typedef struct maze{ int row; int column; char matrix[row][column]; }maze; 通过调用不同的函数,在读取某个文件后,我需要通过给定的参数初始化矩阵,因此2个参数为“row”和“column”。 我的init函数代码是: struct maze* init_maze(int row, int column) { struct maze mazeFilled; struct maze *mazePointer; mazeFilled.row = row; mazeFilled.column = column; return mazePointer; } 但是你可以猜测这不起作用,人们已经提到很难用2个变量创建一个矩阵。 任何人都可以解释我做错了什么。 编辑1: 我根据结构更改了我的代码,但结构保持不变。 我需要分配指针,以便它甚至在独家新闻之外保持活跃状态​​。 我的init函数的新代码是: struct maze* init_maze(void) { int row = 6; int column […]

结构在其他文件的可见性方面如何表现?

这是从对SO的不同问题的答案中得出的: 除非放在共享头文件中,否则结构定义对源文件是私有的。 没有其他源文件可以访问结构的成员,即使给定了指向结构的指针(因为在其他编译单元中不知道布局)。 如果结构需要在别处使用,则它必须仅用作指针。 放置struct structnameforms的前向声明; typedef struct structname structname; 在头文件中,并在代码库中的其他地方使用structname *。 然后,由于结构成员仅出现在一个源文件中,因此结构的内容实际上是对该文件的“私有”。 这让我很困惑。 为什么你只能使用指向结构的指针,即使你包含一个声明它的头文件(但没有定义它)? 我的意思是,如果我包含一个声明函数的头,一个在单独的实现文件中定义的函数,我仍然可以访问该函数 – 为什么结构不同? 即使您可以获得声明,为什么他们的成员是私人的?

C:静态结构

我是C的新手,我正在查看一些代码来了解哈希。 我遇到了一个包含以下代码行的文件: #include #include #include #include #include #include // ————————————————————————— int64_t timing(bool start) { static struct timeval startw, endw; // What is this? int64_t usecs = 0; if(start) { gettimeofday(&startw, NULL); } else { gettimeofday(&endw, NULL); usecs = (endw.tv_sec – startw.tv_sec)*1000000 + (endw.tv_usec – startw.tv_usec); } return usecs; } 我之前从未遇到过以这种方式定义的静态结构。 通常,struct前面是struct的定义/声明。 但是,这似乎表明将存在类型为timeval,startw,endw的静态struct变量。 我试着读一下它的作用,但还没有找到足够好的解释。 有帮助吗?

如何在c中创建一个n-ary树

#include #include struct node{ char *word; int depth, children; struct node **child; }; typedef struct node node; node *createTree(); node *createNode(char *word,int depth); int main(int argv,char *argc[]){ node *root,*current_node; root=createNode(“root”,0); char *array[]={“string1″,”string2″,”string3”}; current_node=root; printf(“root has been created with word: %s \n”,current_node->word); int i; for (i=0; ichild[i]=createNode(array[i],(current_node->depth)+1); current_node->children++; printf(“%s has been inserted to the tree\n”,current_node->word); } […]

如何确定结构的内存布局?

假设我有以下结构(在C中): struct my_struct { int foo; float bar; char *baz; }; 如果我现在有一个变量,比方说 struct my_struct a_struct; 我怎样才能知道该结构的字段将如何在内存中布局? 换句话说,我需要知道a_struct.foo , a_struct.bar和a_struct.baz的地址是什么。 我不能以编程方式做到这一点,因为我实际上正在交叉编译到另一个平台。 澄清 感谢到目前为止的答案,但我无法以编程方式(即使用offsetof宏,或使用小型测试程序)执行此操作,因为我正在交叉编译,我需要知道字段将如何在目标平台上对齐。 我知道这是依赖于实现的,这是我的问题的重点。 我正在使用GCC编译,针对ARM架构。 我最终需要的是能够从目标平台转储内存并使用其他工具解析它,例如Python的struct库。 但为此,我需要知道这些领域是如何布局的。

C相同结构大小不同

我的问题与这个问题有关: c在struct中定义具有不同大小的数组 但是,我不想使用动态分配(嵌入式目标)。 问题回顾: 在C中 ,我希望有两个相同结构的版本,每个版本的静态数组大小不同。 两个结构都将通过指针参数由相同的函数使用。 typedef struct { short isLarge; //set 0 at initialization short array[SIZE_A]; //more arrays } doc_t; typedef struct { short isLarge; //set 1 at initialization short array[SIZE_B]; //more arrays } doc_large_t; void function( doc_t* document ) { if ( document->isLarge ) { //change document into doc_large_t* [1] } //common […]

C标准中char数组结构成员的对齐方式

让我们假设我想读/写一个tar文件头。 考虑到标准C(C89,C99或C11),char数组在结构上是否有任何特殊处理,关于填充? 编译器可以为这样的结构添加填充: struct header { char name[100]; char mode[8]; char uid[8]; char gid[8]; char size[12]; char mtime[12]; char chksum[8]; char typeflag; char linkname[100]; char tail[255]; }; 我已经看到它也用在网络上的代码中。 只是自由,将这个结构写入一个块中的文件,假设不会有任何填充。 当然也假设CHAR_BITS == 8 。 我认为这样的C代码是如此常见,标准会处理这种情况,但我无法找到它,也许我不会是一个好律师。 编辑 接受的答案将根据C标准之一给出严格或最严格的可移植实现,这使我可以使用标准库字符串函数处理这些字段。 考虑CHAR_BITS和所有。 我认为需要为此读取512 uint8_t的数组,之后可能会将它们逐个转换为chars。 有更简单的方法吗