С программа вылетает при использовании 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
байтов в эту область. Это приводит к повреждению информации управления памятью в вашей куче.
Поэтому я бы посоветовал сначала посмотреть на любые выделения памяти в вашем коде, чтобы увидеть, есть ли проблема с ними.
Или, вот мысль, напишите больше кода, чтобы мы могли помочь вам более существенным образом:-)