C中的结构初始化问题

时间:2010-08-07 16:50:47

标签: c linked-list

我正在用C语言编写一个“Set”数据结构的程序。

当Set的一个实例存在时它工作正常,但是当存在Set的两个实例时它不起作用。

当候选者是第一个元素时,我的删除元素的代码也不起作用。

有人可以帮助我吗?

以下是代码:

2 个答案:

答案 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();