分配内存后使用getchar时C程序崩溃

时间:2018-02-02 10:35:08

标签: c crash getchar gcc-pedantic

我正在制作一个C程序,我必须使用-ansi和-pedantic。我想读取stdin输入但是当我调用getchar()时程序崩溃了。以下是产生错误的行:

var token = "your token"
var url = "https://todoist.com/API/v7/sync";
var data = {
    'token' : token,
    'resource_types' : '["all"]',
    };

jQuery.ajax({
    url: url,
    data: data,
    type: 'GET',
    dataType: 'json',
    success: function(response) { 
        console.log(response);
    },
    error: function(response) { 
        console.log('error');
    },
});

当我正常运行它说

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

使用GDB

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]);
}

2 个答案:

答案 0 :(得分:0)

您粘贴的代码绝对没有任何问题,除了我们要确定究竟是什么导致问题的简短方法。

但是,您所看到的断言几乎可以肯定是由于堆损坏。它是通过分配x字节然后将x + 42字节写入该区域而引起的那种事情。这往往会破坏堆中的内存控制信息。

因此,我建议您首先查看代码中的任何内存分配,看看它们是否存在问题。

或者,这是一个想法,发布更多代码,以便我们能够以更实质的方式帮助您: - )

答案 1 :(得分:0)

Finally I found what the problem was. I had something like char *thing = malloc(sizeof thing) but it has to be like char *thing = malloc(sizeof *thing)