我正在用C语言编写一个“Set”数据结构的程序。
当Set的一个实例存在时它工作正常,但是当存在Set的两个实例时它不起作用。
当候选者是第一个元素时,我的删除元素的代码也不起作用。
有人可以帮助我吗?
以下是代码:
答案 0 :(得分:5)
首先,您将指针传递给value by value。即而不是
void Set_Create (Set* set) {
set = malloc(...); // Malloc here leads to memory-leak.
//...
}
int main() {
Set *set; // Some value like 0xdeadbeef pointing somewhere
Set_Create (set);
// set have still undefined value
}
使用
Set *Set_Create () {
Set *set = malloc(...);
/// ...
return set;
}
int main() {
Set *set; // Some value like 0xdeadbeef pointing somewhere
set = Set_Create ();
// set point to new memory
}
或:
void Set_Create (Set *set) {
// No malloc
/// ...
return set;
}
int main() {
Set set; // Create on stack
Set_Create (&set); // Initialize
// ...
}
我建议重新阅读关于指针的章节(不要担心 - 它们被认为很难,但它们对C程序员来说是必须的。)
答案 1 :(得分:4)
我怀疑您要求我们帮您完成作业,所以我不打算为您解决所有代码问题。我只会指出你最严重的错误,这就是你所问的错误 - 为什么第二次调用create_Set()
函数会失败?
test.c,第27-28行:
Set* s2;
Set_Create(s2); //.. Here error comes..
在set.c中,我将其修剪为有意义的代码:
void Set_Create(Set* set){
if(set == NULL){
set = (Set *)malloc(sizeof(Set));
}
set->size = 0;
set->data = -1;
set->next = NULL;
}
正在发生的事情是对Set_Create
的调用都会覆盖一些任意的,不可预测的内存位置。这是一个严重的错误。
在set1
的情况下,您遇到的任意指针似乎恰好指向内存中可以写入的某个位置。谁知道你正在破坏什么数据,但你的数据可以在那个地方生存一段时间。
对于set2
,您遇到的任意指针不是您要修改的有效内存位置,因此程序崩溃。
像这样更改create_Set
:
Set* Set_Create() {
Set * set = calloc(1, sizeof(Set));
set->data = -1;
return set;
}
在test.c中:
Set * set1 = Set_Create();