元素函数的递归指针给出了分段错误(11)

时间:2015-12-07 00:06:17

标签: c++ pointers recursion segmentation-fault

我的小程序以这种方式构建:

  • 我有一个对象Element,其定义如下:

    struct element {
        element* next;
    } typedef element;
    
  • 我的程序正在调用此递归函数...

    int dosomething(element* a) {
        if (a != NULL)
            return dosomething(a->next);
        else
        return 0;
    }
    
  • 在主要功能中:

    int main(void) {
        element* a = (element *) malloc(sizeof(element));
        a-> next = (element *) malloc(sizeof(element));
    
        cout << dosomething(a) << endl;
    
        return 0;
    }    
    

运行本程序时,我得到:

Segmentation fault: 11

因此,定义了aa->nexta->next->next应为NULL,因此该函数应该返回0

为什么这不起作用?

3 个答案:

答案 0 :(得分:1)

你必须用0初始化下一个指针,否则它是未初始化的,在某些情况下“a!= NULL”不会是真的。您可以使用calloc而不是malloc,它使用0

初始化内存

答案 1 :(得分:1)

a->next->next不是NULL。 ```malloc``并不保证分配的内存区域将被初始化为某种东西(即它具有以前存在的值)。

此外,Do I cast the result of malloc?

int main(void) {
    element* a = (element *) malloc(sizeof(element));
    a-> next = (element *) malloc(sizeof(element));
    a->next->next = NULL;

    cout << dosomething(a) << endl;

    return 0;
}  

答案 2 :(得分:0)

您没有制作最后一个元素NULL - malloc不会为您执行此操作。您也应该使用C ++构造。他们非常有帮助。

#include <iostream>

struct Element {
  Element* next;
};

int do_something(Element* a) {
  if(a) {
    do_something(a->next);
  }
  return 0;
}

int main() {
  Element* last = NULL;
  Element* next = new Element;
  next->next = last;
  Element* first = new Element;
  first->next = next;
  std::cout << do_something(first) << std::endl;
  delete first;
  delete next;
  delete last;
  return 0;
}

ideone