将链表从C传递到C++; 当然,C++准备处理C,那么你应该假设使用适当的接口时没有不兼容性。 毕竟,在C中实现了很多SW,并且从C++接口。例如,我使用的是,用C实现的Qt

将链表从C传递到C++; 当然,C++准备处理C,那么你应该假设使用适当的接口时没有不兼容性。 毕竟,在C中实现了很多SW,并且从C++接口。例如,我使用的是,用C实现的Qt,c++,c,qt,C++,C,Qt,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

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;
    }
}

现在,我修改了代码,将列表中的每个元素复制到一个数组中并返回该数组,它工作正常。这是否与堆栈有关,与C和C++不兼容,或者只是指示我在其他地方内存有问题?

< P>当然,C++准备处理C,那么你应该假设使用适当的接口时没有不兼容性。 <>毕竟,在C中实现了很多SW,并且从C++接口。例如,我使用的是,用C实现的Qt

但是为了编译您的代码,我必须做一些更改:这里是底线

把我的清单归档

#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
把我的清单归档

#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; }

查看
my_struct
和其他typedef可能会有所帮助。此外,您的代码似乎不正确(
get\u head()
应该返回一个
my\u struct\p
,而不是
my\u struct
),这表明这可能不是真正的代码,从而进一步增加了准确答案的难度。A会很有帮助,你在写的时候可能会在没有任何帮助的情况下发现你的问题。最后,您是否正在编译调试无优化?除非你准备好进入asm,否则不要相信发布代码上的调试器。我不认为看到我的结构会有什么帮助。它只是一个普通的旧结构,带有下一个指针。以上只是伪代码,是的,函数应该返回my_struct\p。当然,我编译调试模式时没有进行任何优化。问题是,在做上述工作的概念上是否存在已知的问题。如果没有,那么我知道我需要在前面查找一个bug。编辑以显示示例结构和用法这里不应该有任何奇怪的地方,除了可能不同的打包/对齐。我还想说caling conv,但你可能已经检查过了。假设这些都是编译C或C++代码的,这应该是可行的。我很想知道,如果你将
next
指针移到结构的顶部,你的体验是否会发生变化。我知道这听起来很奇怪,也许你已经这么做了,但这仍然是一个有趣的问题。对于其他地方的问题,你可能是对的。
#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; }
#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