将链表从 C 传递到 C++
Posted
技术标签:
【中文标题】将链表从 C 传递到 C++【英文标题】:Passing linked list from C to C++ 【发布时间】:2013-04-26 16:55:27 【问题描述】:将链表从 C 代码传递到 C++ 是否存在已知问题? 我有一个 Qt 对话,我要添加到旧版 C 代码中。 Qt 类(在 C++ 库中)调用 C 库函数,该函数返回指向链表的静态指针。该列表是在 C 库中创建的。例如:
C 代码:
typedef my_struct_s my_struct_t, *my_struct_p;
struct
int some_data;
double some_more_data;
my_struct_p next;
my_struct_s;
void create_list()
my_struct_p next;
SP_head = (my_struct_p) calloc(1, sizeof(my_struct_t));
next = (my_struct_p) calloc(1, sizeof(my_struct_t));
SP_head->some_data = 1;
next->some_data = 2;
SP_head->next = next;
static my_struct_p SP_head=(my_struct_p)0;
extern my_struct_p get_list()
if(!SP_head)
create_list();
return SP_head;
C++ 代码:
myclass::do_something()
my_struct_p list = get_list();
for(my_struct_p ptr = list; ptr; ptr = ptr->next)
std::cout << ptr->value;
SP_head
是有效的,并且在我获得它时包含一堆条目。在我的调试器中,我可以看到下一个条目已填充并且在从函数 get_list()
返回时有效。
当我尝试分配ptr=ptr->next
时,无论是在for 循环内还是在while 循环结束时或通过临时指针,值都是null
。即
temp_ptr = ptr->next;
// temp_ptr is null
// but I can see ptr->next looks ok in a debugger
我现在更改了代码,将列表的每个元素复制到一个数组中并返回该数组,它工作正常。这与堆栈以及与 C 和 C++ 的不兼容有关,还是只是表明我在其他地方存在内存问题?
【问题讨论】:
查看my_struct
可能会有所帮助,以及其他类型定义。此外,您的代码似乎不正确(get_head()
应该返回 my_struct_p
,而不是 my_struct
),表明这可能不是 真正的 代码,从而进一步使准确的答案变得更加困难。 SSCCE 会非常很有帮助,你可能会在编写它时发现你的问题没有任何帮助。最后,您是否正在编译调试无优化?除非你准备好进入 asm,否则永远不要相信发布代码的调试器。
我看不出看到 my_struct 会有什么帮助。它只是一个带有下一个指针的普通旧结构。以上只是伪代码,是的,该函数应该返回一个 my_struct_p。当然,我正在编译我的调试模式,没有优化。问题是执行上述操作的概念是否存在已知问题。如果没有,那么我知道我需要早点查找错误。
已编辑以显示示例结构和用法
这里不应该有什么奇怪的地方,除了可能不同的包装/对齐方式。我也会说 caling conv,但你可能已经检查过了。假设这些都是相同的编译 C 或 C++ 代码,这应该可以工作。我很想知道如果您将next
指针移动到结构的top,您的体验是否会发生变化。我知道这听起来很奇怪,也许你已经做到了,但它仍然是一个有趣的问题。对于其他地方的问题,您可能是对的。
【参考方案1】:
当然,C++已经做好了处理C的准备,那么你应该假设在使用proper接口的时候,没有不兼容。
毕竟,有许多软件是用 C 实现并从 C++ 接口的。例如,我正在使用 SWI-Prolog - 用 C 实现 - 来自 Qt。
但是为了编译你的代码,我不得不做一些改变:这里是底线
文件 my_list.h
#ifdef __cplusplus
extern "C"
#endif
struct my_struct_s
int some_data;
double some_more_data;
struct my_struct_s *next;
;
typedef struct my_struct_s my_struct_t, *my_struct_p;
void create_list();
extern my_struct_p get_list();
#ifdef __cplusplus
#endif
文件 my_list.c
#include "my_list.h"
#include <stdio.h>
#include <stdlib.h>
static my_struct_p SP_head=(my_struct_p)0;
void create_list()
my_struct_p next;
SP_head = (my_struct_p) calloc(1, sizeof(my_struct_t));
next = (my_struct_p) calloc(1, sizeof(my_struct_t));
SP_head->some_data = 1;
next->some_data = 2;
SP_head->next = next;
my_struct_p get_list() return SP_head;
文件 main.cpp
#include "my_list.h"
#include <iostream>
class myclass
public:
void do_something()
my_struct_p list = get_list();
for(my_struct_p ptr = list; ptr; ptr = ptr->next)
std::cout << ptr->some_data << std::endl;
;
int main()
create_list();
myclass c;
c.do_something();
现在编译并运行:
g++ my_list.c main.cpp
./a.out
1
2
【讨论】:
以上是关于将链表从 C 传递到 C++的主要内容,如果未能解决你的问题,请参考以下文章
线性表练习之Example038-编写一个函数将链表 h2 链接到链表 h1 之后,要求链接后的链表仍然保持循环链表形式