将链表从 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-&gt;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++的主要内容,如果未能解决你的问题,请参考以下文章

c语言中链表的问题

尝试对链表进行排序时出现左值错误

C++怎么利用递归实现单线链表的反向输出??

线性表练习之Example038-编写一个函数将链表 h2 链接到链表 h1 之后,要求链接后的链表仍然保持循环链表形式

我在将链表相应地添加到中间/端时遇到问题

在 C 编程中将链表添加到另一个链表