Member 12544459 Ответов: 2

Результат проверки я получаю segementation вина


пожалуйста, скажите мне, почему я получаю ошибку сегментации в этом коде.Я получаю ошибку на 72-й строке. Я хотел сделать еще один узел связи, хотя линка, но я не могу. Когда я пытаюсь получить доступ к узлу, написав first->linkA=temp, я получаю ошибку

Что я уже пробовал:

typedef struct node
        {
          char word[100];
          char meaning[100];
          struct node *link;
        }*wordptr;
        
        typedef struct alphanode
        {
        char word[100];
        char meaning[100];
        struct alphanode *linkA;
        
        struct alphanode *linkB;
        }*alphabets;
        
        
        int main()
        {
            int i=1;
            alphabets first, temp;
        
            alphabets tempfirst=(alphabets)malloc(sizeof(struct alphanode));
        
            tempfirst->linkA=NULL;
            tempfirst->linkB=NULL;
        
            first=temp;
        
        
            //creating 26 linked nodes
            for(i=1;i<=26;i++)
            {
              temp=(alphabets)malloc(sizeof(struct alphanode));
              tempfirst->linkB=temp;
        
        
              temp->linkA=NULL;
              temp->linkB=NULL;
        
              tempfirst=temp;
            }
        
        
            enterAlpha("bcd", first);
            displayMyDictionary(first);
        
            printf("Hello world!\n");
            return 0;
        }
        
        void enterAlpha(char str[], alphabets first)
        {
        int i=0;
        
           //takes to the alphate starting node
          for(i=0;i<=((int)str[0]-'a');i++)
          {
            first=first->linkB;
          }
            
          alphabets temp = (alphabets)malloc(sizeof(struct alphanode));         
           first->linkA=temp;
           first=temp;
            printf("%s", first->word);
           
        
        }

2 Ответов

Рейтинг:
6

Jochen Arndt

Ваш first указатель недопустим, поскольку он инициализируется неопределенным значением:

// These are not initialised and contain therefore indeterminate values
// It would be better to set them to NULL and use appropriate checks
//  when using them later
alphabets first, temp;
        
alphabets tempfirst=(alphabets)malloc(sizeof(struct alphanode));
        
tempfirst->linkA=NULL;
tempfirst->linkB=NULL;

// Because temp is not initialised, first contains an indeterminate value too        
first=temp;

// ...

// Passing invalid pointers here
enterAlpha("bcd", first);
displayMyDictionary(first);

Лучший код сделал бы что-то вроде этого:

#include <assert.h>

int main()
{
    alphabets first = NULL;
    alphabets temp = NULL;
    // ...
}

void enterAlpha(char str[], alphabets first)
{
    // Break with debug builds
    assert(str != NULL);
    assert(first != NULL);

    // Avoid seg faults with release builds
    if (NULL == first)
        return;

    // ...
}


Рейтинг:
0

CPallini

Цитата:
первый=темп;
следует
first=tempfirst;