结构的“退出,分段错误”

Posted

技术标签:

【中文标题】结构的“退出,分段错误”【英文标题】:"exited, segmentation fault" with struct 【发布时间】:2021-07-17 07:14:23 【问题描述】:

对于下面的 C++ 代码,我已经声明了一个名为“newNode”(node *newNode)的“node”结构的指针,并尝试输入一个 id # 并将其输入到 newNode->id 中。输入 id # 后,我收到一条错误消息,提示“已退出,分段错误”。我了解这意味着我们正在尝试访问我们无权访问的内存位置,但不知道如何解决此问题。我很感激任何反馈。谢谢。

#include <iostream>
using namespace std;

struct node 

    int id;
    string name;
    int age;
    node *nxt;
;

node *head = NULL;

void InsertNode()

  node *currentNode, *newNode, *nextNode;

  cout << "You will now be prompted to enter the ID number, name, and age of a particular person..." << endl;
  cout << "Enter ID number: ";
  cin >> newNode->id;
  cout << "Enter name: ";
  cin >> newNode->name;
  cout << "Enter age: ";
  cin >> newNode->age;

  currentNode = head;

  while (currentNode != NULL)
  
    if (newNode->id == currentNode->id)
    
      cout << "The ID you entered was already assigned to another node. Please enter a different ID number for the node that you are inserting: " << endl;
      cin >> newNode->id;
    else
      currentNode = currentNode->nxt;
    
  

  if (head == NULL)
  
    head = newNode;
  else
    currentNode = head;
    while (currentNode != NULL)
    
      nextNode = currentNode->nxt;
      if (newNode->id < nextNode->id)
      
        if(currentNode == head)
        
          head = newNode;
          newNode->nxt = nextNode;
        else if (nextNode->nxt == NULL && newNode->id > nextNode->id)
        
          newNode->nxt = NULL;
          nextNode->nxt = newNode;
        else
          newNode->nxt = nextNode;
        
      else
        currentNode = nextNode;
      
    
  


int main()

  InsertNode();

  return 0;

【问题讨论】:

如果你使用指针,你需要将它指向某个东西。 Turn on compiler warnings, and the compiler will diagnose many categories of mistakes. 【参考方案1】:

您只创建了可以指向结构类型节点的指针,但实际上并没有为这些结构分配内存。这就是为什么您在尝试访问不存在的位置时遇到分段错误的原因。 首先通过动态内存分配创建一个结构节点,比如 malloc,然后尝试将 Id 分配给它。

【讨论】:

【参考方案2】:

你已经创建了一个指向结构的指针,当你试图在指针的位置插入一些东西,但指针没有指向结构的对象。

您需要为插入动态分配节点。

node *currentNode, *newNode, *nextNode;

newNode = new node(); // <- this is what you need to do, so you can insert. 

  cout << "You will now be prompted to enter the ID number, name, and age of a particular person..." << endl;
  cout << "Enter ID number: ";
  cin >> newNode->id;
  cout << "Enter name: ";
  cin >> newNode->name;
  cout << "Enter age: ";
  cin >> newNode->age;

前进,繁荣昌盛。

【讨论】:

以上是关于结构的“退出,分段错误”的主要内容,如果未能解决你的问题,请参考以下文章

释放时填充结构数据会导致段错误

分配结构数组时出现段错误

返回 malloc 的结构会给出段错误和不同的地址

尝试初始化结构数组时出现段错误

结构体指针之 段错误 具体解释(segmentation fault)

尝试访问时带有结构的 C mq_receive() 会导致段错误