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
和一个int
,c
和k
)一个\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'
等等