Tag: pointers

如何将结构列表/数组从python传递给C

我有一个C函数,必须可以从C和Python调用。 我无法弄清楚如何将c-cons结构的python列表传递给c函数,每个结构包含几个嵌套结构。 这些结构中的一个在python中看起来像这样: class STATION_MM_NODE(ctypes.Structure): _fields_ = [ (“signal”, MM_STRUCT), (“noise”, MM_STRUCT), (“signalWindowLen”, ctypes.c_double), (“metadata”, SAC_PZ) ] 在C中像这样: typedef struct stationMMnode { struct mantleMagStruct *signal; struct mantleMagStruct *noise; double signalWindowLen; SAC_PZ metadata; } stationMMnode_t; 采用stationMMnode结构数组的c函数可以调用为: double magnitudeCompute_Mw_Mm_Event(stationMMnode_t **stationMMarray, int numStations); 例如,我可以将其称为纯粹来自C,如: int testfunc() { stationMMnode_t *node1 = malloc(sizeof(struct stationMMnode)); node1->signalWindowLen = 500; stationMMnode_t *node2 = […]

C指针混乱

我想在内存中存储一​​个字符串并稍后阅读: $$->desc.constant->base.id = (char*)malloc(200); sprintf($$->desc.constant->base.id, “%f”, $1); printf(“->%s\n”, $$->desc.constant->base.id); //LINE A printf(“->%i\n”, $$->desc.constant); //LINE B //SOME OTHER CODE //Then, later on in a function call: printf(“%i”, expr->desc.constant); // LINE D printf(“%s”, expr->desc.constant->base.id); // LINE C 虽然线路B和线路D显示相同的地址,但线路C中的printf失败并出现分段故障。 我错过了什么? 真的很感激任何帮助!

在C中正确地将const void指针强制转换为const char指针数组

我有一段看起来像这样的C代码: const char (*foo)[2] = bar(); 现在bar()是一个返回(const void *) 。 如何正确转换此const指针? 该代码从GCC产生此警告: “initialization discards qualifiers from pointer target type”. 以下是我不成功的一些尝试: const char (*foo)[2] = (const char *)bar(); const char (*foo)[2] = (const void **)bar(); 原始代码确实有效,我只是无法通过正确转换返回值来消除警告。 编辑:有人建议: const char (*foo)[2] = (const char (*)[2])bar(); 它似乎是正确的,但GCC给出了这个警告: “cast discards qualifiers from pointer target type” 这几乎与原始警告相同。 编辑2:好的,我想我已经知道了。 这里真正的问题是bar()的( const […]

c分配不兼容的类型,指针问题?

嗨,我正在使用C,我有一个关于分配指针的问题。 struct foo { int _bar; char * _car[SOME_NUMBER]; // this is meant to be an array of char * so that it can hold pointers to names of cars } int foofunc (void * arg) { int bar; char * car[SOME_NUMBER]; struct foo * thing = (struct foo *) arg; bar = thing->_bar; // […]

在C中创建和理解结构的链接列表

我无法一起掌握struct和链表数据结构的概念。 例如,假设我们有这样的代码:一个具有worker的内容的struct ,这些struct的链表包含每个worker的节点和指向下一个节点的指针(?)。 typedef struct Schedule { char name[10]; char description[10]; int hours; int workordernum; } Work; typedef struct linkedlist { struct Schedule work; struct linkedlist *next; } Node; 问题是如何创建一个始终在列表开头添加节点的方法,一种使用用户定义的workordernum将其添加到列表中任何位置(中间)的方法,以及始终将其添加到最后的方法。 我不太了解->和*正确使用。 我确实在网上阅读了有关创建头部和尾部节点的信息,但我没有正确使用它,因为它们有一个列表struct和一个节点struct 。 我没有得到的另一件事是,假设在列表的开头添加一个节点,你如何改变以前所有节点的每个workordernum值呢? 我理解每次添加,删除或移动节点时都必须跟踪,这意味着每次调用这些方法时,我们必须有一个跟踪数字的变量。 因此,如果列表中的节点都已准备就绪,其顺序为1,那么我们在开头添加另一个节点,如何将订单号1更改为2,将1添加到1? 或者如果我们只有一个指针,node-> next-> next-> next怎么工作? 然后我们将如何打印所有这些? 因为我们不能使用for循环。 所以这些是我无法把握代码的概念。 如果你花时间解释它,而不是仅仅给出代码,如果可能的话,我会非常感激。 因为我必须应用我学到的东西来移动并删除节点。 我想自己学习。 如果必须给出一些代码示例,那就没关系,但请不要为我发布所有答案代码。 -谢谢 *请原谅任何格式错误,因为我是这个网站的新手。 编辑:我确实理解指针是一个地址,并且->属于“指向”一个成员。 我的意思是我理解所有基础知识,但我的理解不够坚定,否则我可以做我需要帮助的事情。 编辑2:我将尝试使用我目前学到的链接列表创建一个头节点。 我将使用上面的结构,它将是松散的代码,而不是完美的。 这只是为了确保我到目前为止在正确的轨道上。 int […]