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;
}
и теперь должно быть нормально.