С программа вылетает при использовании getchar после выделения памяти

Я делаю программу на C, где я должен использовать -ansi и -pedantic. Я хочу прочитать ввод stdin, но когда я вызываю getchar(), программа вылетает. Вот строка, которая делает ошибку:

while((data = getchar()) != EOF) {

Когда я запускаю это нормально, это говорит

Calculator: malloc.c:2394: 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 (core dumped)

И с ГБД

Program received signal SIGABRT, Aborted.
0x00007ffff7a42428 in __GI_raise (sig=sig@entry=6)
at ../sysdeps/unix/sysv/linux/raise.c:54
54  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory

РЕДАКТИРОВАТЬ:

Вот мой код с выделениями

struct Expression* initParse(int argc, char const *argv[]) {
    struct Expression *expr = malloc(sizeof expr);
    enum WaitFor next = MinusNext | NumberNext | NewBraquetNext;
    testStdin(argc, argv);
    if(!expr)
        exit(1);
    expr->level = 0;
    expr->part = 0;
    expr->parts = malloc(sizeof expr->parts);
    if(!expr->parts)
        exit(1);
    expr->parts[0] = malloc(sizeof expr->parts[0]);
    if(!expr->parts[0])
        exit(1);
    expr->parts[0][0] = malloc(sizeof expr->parts[0][0]);
    if(!expr->parts[0][0])
        exit(1);
    expr->parts[0][0]->type = MainPartType;
    expr->parts[0][0]->priority = 0;
    return parse(expr, next, argv[1]);
}

И заголовок:

enum WaitFor
{
    MinusNext =         1 << 0,
    OperatorNext =      1 << 1,
    NumberNext =        1 << 2,
    NewBraquetNext =    1 << 3,
    EndBraquetNext =    1 << 4,
    FinalEndNext =      1 << 5
};

struct Part
{
    void *content;
    int priority;
    char *parent;
    enum PartType type;
};

struct Expression
{
    struct Part ***parts;
    int level;
    int part;
    struct Part lastNumber;
};

2 ответа

Наконец я обнаружил, в чем проблема. У меня было что-то вроде char *thing = malloc(sizeof thing) но это должно быть как char *thing = malloc(sizeof *thing)

В коде, который вы вставили, нет абсолютно ничего плохого, кроме того, что мы можем сказать, что именно поэтому мы можем точно определить причину проблемы.

Однако утверждение, которое вы видите, почти наверняка связано с поврежденной кучей. Это та вещь, которая вызвана выделением x байты, а затем писать, например, x + 42 байтов в эту область. Это приводит к повреждению информации управления памятью в вашей куче.

Поэтому я бы посоветовал сначала посмотреть на любые выделения памяти в вашем коде, чтобы увидеть, есть ли проблема с ними.

Или, вот мысль, напишите больше кода, чтобы мы могли помочь вам более существенным образом:-)

Другие вопросы по тегам