Struct становится NULL даже после присвоения значения другой функции в цикле - PullRequest
0 голосов
/ 05 марта 2019

У меня проблемы с моим кодом.Как вы можете видеть ниже, я должен составить список, используя технику связанного списка.Моя проблема в том, что когда я печатаю s-> item вне функции add () после ее выполнения, программа вылетает.Когда я печатаю s-> item внутри функции add () , он печатает правильные данные.Почему Statistician s снова становится нулевым, даже если его инициализация находится вне цикла while?

Пожалуйста, не обращайте внимания на typedef, они даются нашим инструктором, и мы должныиспользуйте его в качестве основы, поэтому нам не нужно ничего менять с помощью typedef и структур.

typedef struct node *nodePtr;
struct node {
    int item;
    nodePtr next;
};
typedef nodePtr Statistician;

Statistician newStatistician(){
      Statistician s = (Statistician)malloc(sizeof(Statistician));
      s = NULL;
      return s;
}

void add(Statistician s, int x){

Statistician newNode = (Statistician)malloc(sizeof(Statistician));

if(s == NULL){ // first node
    printf("first");
    newNode->next = NULL;
    newNode->item = x;
    s = newNode;

main(){
int menuChoice, clearDataChoice, x, outputInt, exitChoice, check;
float  outputFloat;
Statistician s = newStatistician();

while (TRUE){
    printf("\t\t*** STATISTICIAN PROGRAM v1 ***\n\n\n");
        printf("Please enter data to be added : ");
        x = inputNum();
        add(s, x);
        printf("%d", s->item);
//... bunch of other code

   if(exitChoice==TRUE)
        return 0;
    else{
        printf("\n\nPress any key to continue...");
        getch();
        system("cls");
        fflush(stdin);
        continue;
    } 
}

EDIT: add и main - это две разные функции

   void add(Statistician s, int x){}
    main(){}

1 Ответ

0 голосов
/ 05 марта 2019

Поговорите со своим инструктором и попросите его / ее объяснить вам диапазон переменных.

Основная причина проблемы заключается в том, что Statistician - это node *.Итак, вы передаете указатель на Statistician на add(), но add() получает приватную копию самого указателя: его переменную s.Вы модифицируете эту личную копию s, но эта модификация не влияет на s в main().Таким образом, все изменения, которые вы вносите в личную копию в add(), теряются при ее возврате.

Самый обычный способ решить эту проблему, и это довольно распространенный шаблон в C, - вернуть возможно измененную частную копию.копия s с add().Таким образом, вы изменили бы его объявление на:

Statistician add(Statistician s, int x)

, а затем добавили следующее в самом низу:

return s;

Затем, когда вы на самом деле вызываете его в main(), измените строкуна это:

s = add(s, x);

Попробуйте и посмотрите, как это работает.

...