Вызов функции меняет значение другого указателя - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть следующий код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXNOME 60

typedef struct Periodo
{
    char nome[MAXNOME];
    struct Periodo *nextPeriodo;
} periodo;

void getNomePeriodo(char *nomePeriodo){

    printf("Type name: ");
    scanf("%s", nomePeriodo);

    return;
}

void getMenuHeader(){
    printf("\n\n");
 }

void insertPeriodo(periodo **basePeriodo){

    periodo novoPeriodo;
    getNomePeriodo(novoPeriodo.nome);
    novoPeriodo.nextPeriodo = NULL;

    periodo *itrPeriodo = *basePeriodo;
    while(itrPeriodo->nextPeriodo!=NULL){
        itrPeriodo = itrPeriodo->nextPeriodo;
    }

    itrPeriodo->nextPeriodo = &novoPeriodo;
    printf("OK!\n");
    return;
}

int main(){
    int *opcaoMenu = malloc(sizeof(int));

    periodo *basePeriodo = malloc(sizeof(periodo));

    insertPeriodo(&basePeriodo);
    printf("%p\n", (basePeriodo)->nextPeriodo->nextPeriodo);
    getMenuHeader();
    printf("%p\n", (basePeriodo)->nextPeriodo->nextPeriodo);
    return 0;
}

В принципе, проблема, с которой я сталкиваюсь, заключается в том, что похоже, что значение (basePeriodo)->nextPeriodo->nextPeriodo меняется, когда я вызываю функцию getMenuHeader, вывод I у меня есть это:

Type name: 2020
OK!
(nil)


0x7ffe9dd7d840

Я ожидаю, что значение (basePeriodo)->nextPeriodo->nextPeriodo будет таким же, независимо от вызова функции, и будет NULL, как и до функции, но я понятия не имею, почему это После того, как я позвоню, кто-нибудь может объяснить, почему это происходит?

1 Ответ

2 голосов
/ 06 апреля 2020

У вас есть две проблемы (как минимум):

  1. Структура **basePeriodo является неинициализированной , и ее члены будут неопределенными . Это включает в себя указатель nextPeriodo, который не может быть NULL. Это приведет к тому, что l oop in insertPeriodo может перебраться в нераспределенную память, что приведет к неопределенному поведению .

  2. Когда вы исправите эту проблему, novoPeriodo является локальной переменной внутри функции insertPeriodo. Как только функция вернет время жизни novoPeriodo, закончится, и любые указатели на novoPeriodo станут недействительными. Это означает, что присвоение

    itrPeriodo->nextPeriodo = &novoPeriodo;
    

    недопустимо и также приведет к неопределенному поведению , если вы используете этот указатель после возврата из функции.

    Распространенным решением является динамическое выделить структуру узла.

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