功能指针(列表)

时间:2015-03-14 21:45:55

标签: c++ list pointers

我必须编写此程序,但我无法在功能主中进行任何更改, 当Node * head声明为全局变量时,此程序有效(函数不包含" Node * head"在参数中)。 这个程序编译成功,但后来是分段错误(我知道为什么,Head没有改变,它仍然是0,但我不知道如何解决)。有什么想法吗?

#include <iostream>
#include <cstdlib>
using namespace std;
struct Node{
  int val;
  Node* next;
};
void addBeg(Node* head,int val)
{
  Node* temp = (Node*)malloc(sizeof(Node));
  temp->val=val;
  temp->next=head;
  head=temp;
}
int main()
{
  Node* head=0;
  addBeg(head,1);
  cout << head->val << endl; //checking if head was changed correctly 
  return 0;
}

2 个答案:

答案 0 :(得分:2)

如果要更改函数内部的指针,请发送“指针指针”,例如:

#include <iostream>
#include <cstdlib>
using namespace std;
struct Node{
  int val;
  Node* next;
};
void addBeg(Node** head,int val)    // Node** instead of Node*
{
  Node* temp = (Node*)malloc(sizeof(Node));
  temp->val=val;
  temp->next=*head;
  *head=temp;                  // *head  instead of head
}
int main()
{
  Node* head=0;
  addBeg(&head,1);   // &head instead of head
  cout << head->val << endl; //checking if head was changed correctly 
  return 0;
}

修改

或者只使用指针的参考参数:

void addBeg(Node* &head,int val)
{
  Node* temp = (Node*)malloc(sizeof(Node));
  temp->val=val;
  temp->next=head;
  head=temp;
}

答案 1 :(得分:0)

如果您要修改它,则需要通过引用传递头指针。其他任何东西都需要修改main(),这显然是禁止的:

改变这个:

void addBeg(Node* head, int val)

对此:

void addBeg(Node*& head, int val) // NOTE: see reference &

See it live here

也就是说,您应该使用new,而不是malloc,理想情况下使用标准容器,例如std::vector<>std::list<>std::deque<>而不是,但这与这个问题无关。