我的小程序以这种方式构建:
我有一个对象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
因此,定义了a
和a->next
。 a->next->next
应为NULL
,因此该函数应该返回0
?
为什么这不起作用?
答案 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;
}