簡體   English   中英

C ++為什么指針值改變了?

[英]C++ Why pointer value changed?

我只是測試一個鏈接。 但是,在將元素插入列表后,傳遞給函數GetElement()的列表地址是不期望的,並且列表應該是引用類型。 我只是不明白為什么。

這是我的主要程序:

#include "stdafx.h"
#include <string>
#include <iostream>

typedef struct Node
{
    int data;
    struct Node *next;
} Node;

typedef struct Node *LinkList;

void InsertElement(LinkList *header, int i, int e)
{
    LinkList p = *header;
    int j = 0;

    while (p && j < i)
    {
        p = p->next;
        j++;
    }

    if (!p || j > i)
        return;

    Node newNode;
    newNode.data = e;
    newNode.next = p->next;

    p->next = &newNode;
}

void GetElement(LinkList list, int i, int *value)
{
    LinkList p = list->next;
    int j = 1;
    while (p && j < i)
    {
        p = p->next;
        j++;
    }
    if (!p || j >= i)
        return;

    *value = p->data;
}
int _tmain(int argc, _TCHAR* argv[])
{
    LinkList header = (LinkList)malloc(sizeof(Node));
    header->next = NULL;

    InsertElement(&header, 0, 1);
    int res = -1;
    GetElement(header, 1, &res);

}

當我調試時,我發現函數GetElement()中的參數“ list”進入該函數后就被更改了。

這是一個問題:

Node newNode;
...
p->next = &newNode; // <<== Using a pointer to local

上面的newNode是一個局部變量,函數退出后,該局部變量及其內存將不起作用。 這將導致不確定的行為,因為該節點的內存已被釋放。

相反,使用malloc可以解決此問題,就像您在_tmain所做的那樣。 更好的是,使用new ,因為它是C ++,而malloc是C樣式的分配。

解決此問題后,將彈出與節點數有關的另一個問題:您正在分配分配給head的節點,但未使用它。 由於無論如何都將指針傳遞給指針,因此應將指針傳遞給header ,並通過雙指針對其進行修改。

您的程序表現出不確定行為的症狀。 未定義的行為是由InsertElement的以下幾行引起的。

Node newNode;
newNode.data = e;
newNode.next = p->next;

p->next = &newNode;

您正在返回一個指向堆棧上對象的指針。 從函數返回后,指針無效。 稍后,在GetElement ,您將訪問該指針。

您需要使用的是:

Node* newNode = new Node;
newNode->data = e;
newNode->next = p->next;

p->next = newNode;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM