【发布时间】: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,您的体验是否会发生变化。我知道这听起来很奇怪,也许你已经做到了,但它仍然是一个有趣的问题。对于其他地方的问题,您可能是对的。