Tag: struct

MPI_Allgather和动态结构

我想用MPI_Allgather()发送一个结构数组,但我的结构有一个动态数组: typedef struct { float a; int* b; } structure_t; 我的结构通过以下方式初始化: structure_t *resultat = (structure_t*) malloc( sizeof( structure_t ) + n * sizeof( int ) ); 但是如何使用MPI_Allgather发送我的结构? 如何创建两个(发送和接收)数组?

在函数内部使用realloc扩展数组 – 指针?

我确信答案就是我不能正确理解指针和参考! 所以在我的C文件的开头我为人们定义了一个结构: typedef struct { char id[4]; int age; char name[128]; } people; 然后在main()内部创建一个由10 个人组成的数组,称为记录 。 people* record = (people*)malloc(sizeof(people)* 10); 在main()中我们开始然后潜入一个函数 MyFunction(record); (此函数在main()之前的C文件的开头具有原型 int MyFunction(people *record); 在MyFunction()内部,我们做了各种各样的事情,包括想要增加记录数组的大小,以便它可以容纳更多的人结构。 我试图增加记录数组大小 struct people *tmp = realloc(record, 20 * sizeof (people)); if (tmp) { record = tmp; } 但是这不起作用,如果我尝试在数组中使用新添加的结构,则会导致内存损坏。 正如我所说,我确信这是因为我没有正确地低估指针和参考。 请注意,我不能让MyFunction()将扩展记录数组作为其返回类型,因为我已经将其返回int用于其他内容(我不确定我是否也能正常工作!) -我需要它使用主记录数组。 有人能指出我正确的方向吗?

将不同的结构传递给函数(使用void *)

我需要弄清楚如何将两个不同的结构传递给一个函数。 我尝试使用void *作为参数,但我收到错误: warning: dereferencing ‘void *’ pointer error: request for member left in something not a structure or union 成员权利相同的错误 这是我用一般术语做的(代码可能无法编译)。 struct A{ char *a; struct A *left, *right; } *rootA; struct B{ char *b; struct B *left, *right; } *rootB; void BinaryTree(void *root, void *s){ if(condition) root->left=s; else if(condition) BinaryTree(root->left, s); if(condition) root->right=s; […]

为什么以下代码的输出是-1和-2?

为什么下面代码的输出是-1和-2,它应该是1和2,对吧? 在以下结构的64位服务器大小上也是4字节,它应该是8字节对吗? #include struct st { int a:1; int b:2; }; main() { struct st obj={1,2}; printf(“a = %d\nb = %d\n”,obj.a,obj.b); printf(“Size of struct = %d\n”,sizeof(obj)); }

限制结构中的关键字和指针

通过使用restrict关键字,如下所示: int f(int* restrict a, int* restrict b); 我可以指示编译器数组a和b不重叠。 说我有一个结构: struct s{ (…) int* ip; }; 并编写一个带有两个struct s对象的函数: int f2(struct sa, struct sb); 在这种情况下,我怎样才能类似地指示编译器a.ip和b.ip不重叠?

所有结构标识符都自动向前声明

在回答警告:从链表数组的不兼容指针类型进行赋值时 ,我注意到任何用struct关键字识别的未声明标识符都被视为前向声明的标识符。 例如, 下面的程序编译得很好: /* Compile with “gcc -std=c99 -W -Wall -O2 -pedantic %” */ #include struct foo { struct bar *next; /* Linked list */ }; int main(void) { struct bar *a = 0; struct baz *b = 0; struct foo c = {0}; printf(“bar -> %p\n”, (void *)a); printf(“baz -> %p\n”, (void *)b); […]

如何在函数内使指针(到结构)为空

一个class轮问题: 有人可以解释为什么thisNode=NULL在函数中不起作用以及如何以其他方式实现相同的结果。 介绍: 在我开始研究数据结构时,我最近开始使用指针构建了很多。 历史: 我编写了堆栈,队列,二叉搜索树和表达式树,并将很快开始编写avl树。 作为一名学生,我仍然没有意识到许多概念,并希望得到任何帮助。 方法: 我总是找到其他方法来实现我所需的结果(使头节点归零),比如在main函数中将其置零,或者最终不将它归零并将其保持为具有空数据的头/根节点,然后添加其他(有用的)节点。 (仅用作头部或指向结构的指针) 混乱: 我不明白为什么在函数中对指向struct的指针归零不起作用,但是更改结构数据成员的值之类的其他事情也没有问题。 例如: thisNode->nextNode->data = thisNode->data; *//this does works* thisNode = NULL; *//this doesn’t work* 图片: 题: 有人可以解释为什么thisNode=NULL在函数中不起作用以及如何以其他方式实现相同的结果。 问题领域: void stackPop(stackNode *headNode){ if (headNode!=NULL){ if (headNode->nextNode!=NULL){ stackNode *tempNode = getLatestStackNode(headNode); tempNode->prevNode->nextNode=NULL; tempNode->prevNode==NULL; tempNode->data==’.’; tempNode=NULL; free(tempNode); }else if (headNode->nextNode==NULL){ headNode->data=’\0′; headNode = NULL; free(headNode); } }else{ […]

如何在c ++中连接两个结构类型变量?

我一直试图将一些struct(我定义的)类型变量连接成一个更大的变量。 我得到的基本上是这样的: 我有一个struct和两个struct **类型的变量。 我声明第三个结构C,我想将A和B连接成C.我尝试的是这样的(我现在没有代码在我面前所以我会写一些与某些名字非常相似的东西改变,因为我不记得他们。 struct** A, B; struct** C; (我知道A和B,因为我通过调用另一个函数接收它们) 我像这样为C分配内存。 C = (struct**)malloc(sizeof(A)+sizeof(B)); 我用这样的memcpy移动A和B. memcpy(&C, &A, sizeof(A)); memcpy(&C + sizeof(A), &C, sizeof(B)); 显而易见的是,我所做的并不正确,因为看起来所有这些C只包含A.我很确定问题来自“**”,我无法处理好指针的指针。 有人可以就我的问题给我一些建议吗? 我也不想使用Handles,我必须使用memcpy / memmove。 [评论更新:] 我的结构都是相同的类型。

将结构中的指针分配给变量

该程序应该创建一个动态内存向量。 我很确定我正确使用malloc。 我真正的问题是一些带指针的语法,特别是结构中的指针。 我正在尝试访问结构中的int指针的地址,所以我可以将它分配给另一个指针 我给出的结构是: typedef struct{ int *items; int capacity; int size; }VectorT; 而我正在努力工作的function是: int getVector(VectorT *v, int index){ int *p; p = v->items;//(2) p -= v->size; p += index; return *p; } 这应该取项目指针的地址减去列表中的项目数,并将所需项目的索引添加到p的地址。 然后我返回p的地址。 我有一种非常强烈的感觉,第(2)行不是我需要的语法。 根据我到目前为止的尝试,我的程序要么在调用getVector时崩溃,要么输出(我最好的猜测)一些内存位置。 这是添加向量的代码: void addVector(VectorT *v, int i){ if(v->size >= v->capacity){ //allocate twice as much as old vector and […]

对于struct变量s1,s2,为什么我可以初始化“s1 = {25,3.5}”,将s2指定为“s1 = s2”,但是不能使用“s1 = {59,3.14}?

在C中,如果它们属于同一类型,我们可以将一个结构变量的值赋值给另一个。根据这个,在我的下一个程序中,当两者都是相同类型的struct变量时,我可以使用s1=s2 。但为什么之后我不允许使用s1={59,3.14} ? 我知道我们不能将字符串”Test”分配给字符数组arr而不是初始化语句,因为对于字符串”Test” ,它在赋值期间分解为char*类型,因此存在类型不匹配错误。但是我的程序{59,3.14}不会分解为任何指针,是吗?为什么然后它不允许被分配给s1即使它是相同的类型,特别是因为在初始化期间允许它?什么是在s2和{59,3.14}之间有所不同,以便允许一个被分配给s1而另一个不被分配给s1 。 #include int main(void) { struct test1 { int a; float b; } s1= {25,3.5},s2= {38,9.25}; printf(“%d,%f\n”,s1.a,s1.b); s1=s2; // Successful printf(“%d,%f\n”,s1.a,s1.b); s1= {59,3.14}; //ERROR:expected expression before ‘{‘ token| printf(“%d,%f\n”,s1.a,s1.b); }