Program received signal SIGSEGV, Segmentation fault

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
 
typedef struct node {
    struct node *left;
    struct node *right;
     int  field;
} Node;
 
Node *AddNode(Node *Root, int i) {
    if(Root == NULL) {
        Root->field = i; // *****Выполнение обрывается здесь****
        Root->left = Root->right = NULL;
        Node *Root = malloc(sizeof(Node));
        return Root;
    } else if(i < Root->field) { 
        AddNode(Root->left, i);
        } else {
            AddNode(Root->right, i);
        }
        return Root;
}
 
Node *PrintNode(Node *Root, int i) {
    if(Root != NULL) {
        PrintNode(Root->left, i+1);
            for(int c = 0; c < i; c++)
            printf("%d-->", Root->field);
        PrintNode(Root->right, i+1);
    } else return Root;
}
 
int main()
{
    printf("Enter numbs");
    int *a, b;
    scanf("%d", &b);
    srand(time(NULL));
    a = malloc(b*sizeof(int));
    Node *Root;
    Root = NULL; 
    for(int i = 0; i < b; i++) {
        a[i] = -1000 + rand() % ((1000+1) -(-1000));
        AddNode(Root, a[i]); 
        //PrintNode(Root, a[i]);
    }
    
    PrintNode(Root, 0);
    printf("Hello World");
 
    return 0;
}

Здравствуйте, объясните пожалуйста, Root передается в AddNode с адресом Root 0x0, выдает ошибку Program received signal SIGSEGV, Segmentation fault.


Ответы (1 шт):

Автор решения: KoVadim

Посмотрите внимательно на эти строки

if(Root == NULL) {
    Root->field = i;

в первом проверяем, что Root - это NULL (то есть, там ничего нет). А потом пытаемся разыменовать. А это практически всегда приводит к разнообразным спецэффектам, например, падению.

Разыменовывать NULL нельзя.

Посмотрим чуточку больше

if(Root == NULL) {
    Root->field = i; // *****Выполнение обрывается здесь****
    Root->left = Root->right = NULL;
    Node *Root = malloc(sizeof(Node));
    return Root;
} 

в строке ниже как раз и создается объект. Но Си он выполняет последовательно Ваш код. Явно нужно переставить пару строк

if(Root == NULL) {
    Node *Root = malloc(sizeof(Node));
    Root->field = i;
    Root->left = Root->right = NULL;
    return Root;
} 

и теперь должно быть нормально.

→ Ссылка