簡體   English   中英

將鏈表從C傳遞到C ++

[英]Passing linked list from C to C++

將鏈接列表從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是有效的,並且在獲得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 ++的不兼容性有關,還是僅表明我在其他地方存在內存問題?

當然,C ++已准備好處理C,那么您應該假定使用正確的接口時不存在不兼容性。

畢竟,有很多用C實現並通過C ++接口的軟件。 例如,我正在使用Qt的SWI-Prolog (以C語言實現)。

但是要編譯您的代碼,我必須做幾處更改:這是最底線

文件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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM