цикл не выполняется после назначения указателя на NULL в main () - PullRequest
0 голосов
/ 02 июня 2019

Я написал этот C код из обучающего видео по указателям, и проблема, с которой я столкнулся, заключается в том, что после интеграции head в качестве локальной главной переменной в глобальную переменную, объявленную до main(), программа больше не входит в цикл forи я не могу понять, почему.Интересно, что я удаляю head=NULL, цикл, кажется, выполняется.Кто-нибудь знает, где проблема с назначением NULL на голову?

Вот мой код:

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

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

struct Node* Insert(struct Node* head, int data){
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));    
    (*new_node).data = data;
    (*new_node).next = head;

    head = new_node;
}

void Print(struct Node* head){
    struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
    temp = head;

    while(temp!=NULL){
        printf("%d", (*temp).data);
        temp = (*temp).next;
    }

    printf("\n");
}

int main(){
    struct Node* head = NULL;

    int n, i, x;
    printf("%s", "How large do you want your array to be?\n");
    scanf("%d", &n);

    for(i; i<n; i++){
        printf("Enter a number:\n");
        scanf("%d",&x);
        head = Insert(head, x);
        Print(head);    
    }
    return 0;
}

1 Ответ

2 голосов
/ 02 июня 2019

Я вижу несколько проблем с вашим кодом:

struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
temp = head;

должно быть

struct Node* temp = head;

Тогда у нас есть

for(i; i<n; i++)

, которое должно быть

for(i=0; i<n; i++)

Это может быть причиной вашей проблемы, так как это неопределенное поведение.

Еще одна вещь, которая может вызвать проблемы, это то, что вы не делаете return head в качестве окончательного утверждения вInsert.

Два из них можно легко обнаружить, включив предупреждения компилятора.

Кроме того, не выполняет преобразование malloc

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