【问题标题】:How to properly return a Pointer from a function to another function?如何正确地将指针从函数返回到另一个函数?
【发布时间】:2017-07-21 17:06:41
【问题描述】:

我正在使用指针编写一个小程序, 这是我的代码:

    #include<iostream>

using namespace std;

struct number
{
int data;
number *next;
} test;

number * last_node(number *head)
{
    number *temp = new number;
    temp = head;

    while (temp->next != nullptr)
    {
        temp = temp->next;
    }

    return temp;

}

void insert_at_end (number *head)
{
    number *temp = new number;
    number *last = new number;
last = last_node(*head);

    cout<<"Enter the data";
    cin>>temp->data;
    temp->next = nullptr;
    last->next = temp;
}

void view_all (number *head)
{
    number *temp = new number;
    temp = head;

    while (temp->next != nullptr)
    {
        cout<<temp->data;
        temp = temp->next;
    }
}

int main()
{
    number *head = &test;
    int choice;
    char ans = 'y';

    do
    {



    cout<<"Enter your choice";
    cout<<"\n 1. Insert ";
    cout<<"\n 2. View ";
    cout<<"\n 3. Exit ";

    cin>>choice;

    switch (choice)
    {
        case 1 : insert_at_end(head);
        break;

        case 2 : view_all(head);
        break;

        case 3 : goto label;

        default : cout<<"You have entered wrong choice";
    }

    cout<<"Do you want the menu again ? (y/n)" ;
    cin>>ans;

    }

    while (ans = 'y');

    label:

        return 0;
}

在编译时,在调用函数'last_node(*head)'时说不能将“number”转换为“number*”时出现错误。

你能帮我正确理解吗?

【问题讨论】:

  • operator* 用于取消引用,因此如果 headnumber* 那么 *headnumber
  • last = last_node(*head); 中,您正在取消引用head,并传递number,而last_node 预计会收到number*。此外,您在以下语句number *temp = new number; temp = head; 中泄漏内存(因为您覆盖了指向新分配的number 的指针)。考虑阅读good C++ book

标签: c++ pointers


【解决方案1】:

您犯了一些错误,但直接指出该错误,您只需要传递 head 指针而不是 *head 即可取消引用它。有几个内存泄漏,比如你已经完成的 last_node() 函数内部 -

number *temp = new number;
temp = head;

在堆上创建一个新的number 类型并将该内存指向temp 指针。现在在下一行,您将temp 更改为指向head,从而使您的new number 丢失。此外,在迭代您的链表时,您缺少最后一个元素,因此请查看我所做的修改。另一个严重错误是赋值操作而不是 == 这里 - while (ans = 'y');,小心这些错别字。并且不要在不适合的地方使用goto

#include <iostream>

using namespace std;

struct number {
    int data = 0;
    number *next = nullptr;
};

number *last_node(number *head)
{
    number *temp = head;
    while (temp->next != nullptr) {
        temp = temp->next;
    }
    return temp;
}

void insert_at_end(number *head)
{
    number *temp = new number();
    number *last = last_node(head);

    cout << "Enter the data";
    cin >> temp->data;
    temp->next = nullptr;
    last->next = temp;
}

void view_all(number *head)
{
    number *temp = head;
    while (temp != nullptr) {
        cout << temp->data;
        temp = temp->next;
    }
}

int main()
{
    number *head = new number();
    int choice;
    char ans = 'y';

    do {
        cout << "Enter your choice";
        cout << "\n 1. Insert ";
        cout << "\n 2. View ";
        cout << "\n 3. Exit ";

        cin >> choice;

        switch (choice) {
            case 1: insert_at_end(head); break;
            case 2: view_all(head); break;
            case 3: return 0;
            default: cout << "You have entered wrong choice";
        }

        cout << "Do you want the menu again ? (y/n)";
        cin >> ans;
    }
    while (ans == 'y');

    return 0;
}

【讨论】:

    猜你喜欢
    • 2018-03-01
    • 2016-08-04
    • 2022-01-13
    • 2014-03-30
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多