C Ошибка при создании пустого стека - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь создать пустой стек, но каким-то образом возникает ошибка с malloc, которую я не смог понять даже с помощью debbuger.

Сообщение, которое показывает мой debbuger:

sysmalloc: Assertion (old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0) failed.
Aborted

Как мне это исправить?

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

typedef struct
{
    int x;
    int y;
    int r;
    int g;
    int b;
}Pixel;

typedef int TypeKey;

typedef struct {
    TypeKey Key;
    Pixel P;
} TypeItem;

typedef struct Cell_str *Pointer;

typedef struct Cell_str {
    TypeItem Item;
    Pointer Next;
} Cell;

typedef struct {
    Pointer Top, Bottom;
    int Size;
} TypeStack;

void FEmpty(TypeStack *Stack)
{
    Stack->Top = (Pointer)malloc(sizeof(Cell*));
    Stack->Bottom = Stack->Top;
    Stack->Top->Next = NULL;
    Stack->Size = 0;
}

int Empty(const TypeStack *Stack){
    return (Stack->Top == Stack->Bottom);
}

int size(TypeStack Stack)
{
    return (Stack.Size) ;
}


int main(int argc, char *argv[])
{

    Pixel P[500][500];; 


    TypeStack *Stack;
    FEmpty(Stack);


    return 0;
}

1 Ответ

0 голосов
/ 30 апреля 2018

1

TypeStack *Stack;
FEmpty(Stack);

Stack неинициализирован - ничего не указывает на мусор.

В FEmpty вы немедленно разыменовываете (недействительный) указатель, вызывая неопределенное поведение.

Вам нужно либо выделить структуру, используя malloc, либо просто объявить локальную переменную:

TypeStack Stack;
FEmpty(&Stack);

2

Stack->Top = (Pointer)malloc(sizeof(Cell*));

Далее, вы не выделяете здесь достаточно памяти. Вы только назначаете размер самого указателя , а не структуру, на которую он указывает.

Используйте эту конструкцию, чтобы избежать этой ошибки. И не разыгрывайте результат malloc.

Stack->Top = malloc(sizeof(*Stack->Top));
...