空断言错误

时间:2015-10-17 03:31:06

标签: c

for(i=1;i<dmax;i++){
    /*need to find length of / number of digits in integer
    before converting to string*/
    intlen = 1;
    /*prevents log10(0) equations*/
    if(factorstr[i].k){
        intlen += (int)floor(log10((float)factorstr[i].k));
    }
    /*so total length to be added to factors is
    intlen + 1 (from c in factor) + 1 (from \n) = 2 + intlen*/
    factorsize += 2 + intlen;
    if(factorsize>factors_size){
        factors_size += (factorsize + 1);
        printf("factors before realloc = %s, %d\n",factors,factors_size);
        factors = realloc(factors,factors_size);
        printf("factors after realloc = %s, %d\n",factors, factorsize);
        assert( factors != NULL );
    }

    sprintf(factors+last,"%c%d\n",factorstr[i].c,factorstr[i].k);
    last += intlen+2;
}

嗨,

这段代码旨在连接一个结构中的char和整数(分别包含一个char和一个intck)一个\n。但是,行

assert( factors != NULL );

会导致程序在运行时大约1/5的时间内崩溃(重复运行后)。

断言下方和上方的两个printf函数可以帮助我更好地了解正在发生的事情,并且在崩溃期间看起来像

factors before realloc = [massive string], 100 factors after realloc = (null), 51

底部数字factorsize是一个int,它根据字符串中的整数,字符和空字节数来跟踪使用的内存量,然后将其添加到int { {1}}跟踪factors_size分配给它的内存量。

当前者超过后者时,我会在添加字符串之前重新分配factors个字节数。

然而,当我删除factor_size + factors + 1(倒数第二行)时,我根本没有断言错误。

为什么会这样?我需要最后一行来正确地将整数+ char + nullbyte连接到字符串而不是覆盖它,因此删除它实际上不是一个选项

也就是说,如果我有a0 \ n填充last += intlen+2,则下一个sprintf会转到factors[0], [1], [2] = factors + last,例如它是',0 \ n', factors[3]将变为factors [3], [4], [5],导致因子= ',0\n'等等

0 个答案:

没有答案