【问题标题】:Structure initializing problem in CC中的结构初始化问题
【发布时间】:2010-08-07 16:50:46
【问题描述】:

我正在为 C 中的“Set”数据结构编写程序。

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

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

有人可以帮我吗?

代码如下:

【问题讨论】:

  • 这是家庭作业吗?
  • 这种形式的问题通常不会在 Stack Overflow 上获得太多帮助。如果您的代码相当紧凑,您可以将其插入内联(查看编辑页面侧栏中的格式帮助!),您可能会得到更多关注。如果您的代码不紧凑,请考虑尝试发布一个选定的子集……但您需要有一些理论来了解发生了什么。
  • 如果您真的,真的卡住了,请考虑手动单步执行代码以查看发生了什么(例如,拿一块白板或一张大纸,将方框写到表示变量,并一次设置和重置它们一行代码...)。
  • 我在查看源代码后冒昧添加了“作业”标签。如果我弄错了,Mew 3.2,您可以删除该标签。

标签: c linked-list


【解决方案1】:

首先,您将指针传递给按值设置。 IE。而不是

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 程序员来说是必须的)。

【讨论】:

    【解决方案2】:

    我怀疑您是在要求我们帮助您完成作业,所以我不会为您解决所有代码问题。我只想指出你最严重的错误,也就是你问的那个错误——为什么第二次调用你的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();
    

    【讨论】:

      猜你喜欢
      • 2020-09-23
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      相关资源
      最近更新 更多