C Malloc Assertion

时间:2016-11-20 17:00:10

标签: c malloc

在此代码中执行malloc时出现问题

  /*function starts*/

   if(NULL==(partial_results=(bignum_t**)malloc(sizeof(bignum_t*)*long_op2))){
        return NULL;
    }       

    /*to initialize all the members of the array*/
    for(i=0;i<long_op2;i++){
        (*(partial_results+i))=NULL;
    }


    for(i=long_op2-1;i>=0;i--){
        digit2=op2->digits[i]-48;
        count++;
        carry=0;

        if(count==1){
            count2=0;
        }else{
            count2=count-1;
        }

        /*the next malloc is the one that fails*/
        if(NULL==(*(partial_results+(count-1))=(bignum_t*)malloc(sizeof(bignum_t)))){
            return NULL;
        }   

        /*after this the codes continues, but everything from here is ok an it isn't causing any problem*/

这里的事情是,我正在尝试创建一个long_op2元素数组(这是9),因此在第一个malloc中我创建了一个9 bignum_t指针数组。然后,在for中,我尝试为数组的每个成员创建一个bignum_t结构。当long_op2小于或等于6时我没有问题,但是当它为7或更多时,第一个malloc(假设创建指针的那个)不起作用。我收到了错误,

tp3: malloc.c:2372: sysmalloc: Assertion (old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)' failed. Aborted (core dumped)

问题是,我不是要写的数量超过创建的数组的数量,因为如果long_op2是9,count会达到8 max,所以没关系。 另一件非常奇怪的事情是,当我使用Valgrind运行程序时,它确实有效!

PD:这是我在这里的第一个问题,所以如果我犯了任何错误,我会道歉。

PD2:以下是该计划的运作方式。

980581618*215129902

long_op1 & long_op2     9   9
for with: i, count-1    8   0
doing malloc malloc done 
for with: i, count-1    7   1
doing malloc malloc done 
for with: i, count-1    6   2
doing malloc malloc done 
for with: i, count-1    5   3
doing malloc malloc done 
for with: i, count-1    4   4
doing malloc malloc done 
for with: i, count-1    3   5
doing malloc malloc done 
for with: i, count-1    2   6
doing malloc malloc done 
for with: i, count-1    1   7
doing malloc malloc done 
for with: i, count-1    0   8
doing malloc 
tp3: malloc.c:2372: sysmalloc: Assertion ...

1 个答案:

答案 0 :(得分:0)

对于这一行:

    /*the next malloc is the one that fails*/
    if(NULL==(*(partial_results+(count-1))=(bignum_t*)malloc(sizeof(bignum_t)))){
        return NULL;
    }  

无论如何:

count需要1 <= count <= long_op2。如果超出该范围,那么您将得到未定义的结果。我看不到count的初始化,但是你应该在每个malloc之前打印出count的值。

这只是一个猜测,但我怀疑你真的是这个意思:

    partial_results[i]=(bignum_t*)malloc(sizeof(bignum_t));