Связанный список C изменяется при передаче указателем - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь выяснить, почему мой связанный список изменен в следующей структуре программы:

void edit(NODE pHead)
{
    /* Why is this modifying my list ?? */
    pHead->data = 1337;
}

void call(NODE *pHead)
{
    NODE pFirst = *pHead;

    for(int i = 0; i < 3; i++)
    {
        edit(*pHead);
        *pHead = (*pHead)->next;
    }

    *pHead = pFirst;
    printList(*pHead);
}

int main(int argc, char const *argv[])
{
    /* A simple list */
    NODE pList = NULL;

    /* The number of nodes */
    int n;
    scanf("%d", &n);

    /* Init list */
    for (int i = 0; i < n; i++)
    {
        //Read values.
        int timestamp;
        float data;
        scanf("%d%f", &timestamp, &data);

        //Add node.
        addLastNode(&pList, timestamp, data);
    }

    printList(pList);

    call(&pList);

    return 0;
}

Я просто не понимаю этого.Разве функция редактирования не должна создавать локальную копию моего связанного списка?При печати моего окончательного списка выводом является измененный список, а не исходный. Может кто-нибудь объяснить мне, что не так?Также вот моя структура списка:

/* A structure representing the node of a list */
typedef struct LIST
{
    int timestamp;
    float data;
    struct LIST *next;
} * NODE;

1 Ответ

1 голос
/ 19 марта 2019

Разве функция редактирования не должна создавать локальную копию моего связанного списка?

с

void edit(NODE pHead)
{
     /* Why is this modifying my list ?? */
     pHead->data = 1337;
 }

и

typedef struct LIST
{
    int timestamp;
    float data;
    struct LIST *next;
 } * NODE;

УЗЕЛ является указатель на LIST , поэтому в edit ячейка является , а не копией, и при изменении ее модификация не только локальна

Это точно так:

void edit(struct LIST * pHead)
{
     /* Why is this modifying my list ?? */
     pHead->data = 1337;
 }

это разница с:

 void edit(struct LIST pHead)
 {
     pHead.data = 1337;
 }

, где ячейка является локальной и модификация не оказывает влияния вне

Вот почему никогда не использует typedef, чтобы скрыть указатель , потому что это позволяет вам предполагать, что вы манипулируете значением при манипулировании указателем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...