我一直在重新访问 C 语言,在我的程序中使用后无法释放内存:
int tvalue = 2;
while (smult == 0) {
int * tvaluearray = calloc(allnum, sizeof(int));
tvaluearray = frequencyArray(tvalue, allnum, tvaluearray);
printf("tvalue = %dn", tvalue);
//compare each index of the tvaluearray and the first array
for (int j = 0; j < allnum; j++) {
// printf("tvaluearray[%d]=%d >= firstarray[%d]=%dn", j, tvaluearray[j], j, firstarray[j]);
if (tvaluearray[j] < firstarray[j]) {
// printf("Found the false statementn");
break;
}
else if ( (j+1) == allnum ){
smult = 1;
// printf("Made it to else if! smult = %dn", smult);
}
}
free(tvaluearray);
++tvalue;
}
频率阵列函数如下所示:
int * frequencyArray (int target, int allnum, int targetarray[]) {
int divisor = 2;
for (int i = 0; i < allnum; i++)
targetarray[i] = 0;
//find the common factor frequency of the given number
while (target > 1) {
if (target % divisor == 0) {
targetarray[divisor] += 1;
target /= divisor;
}
else
++divisor;
}
return targetarray;
}
在稍微尝试了一下之后,我尝试了以下方法,结果不同:
1( 删除免费的目标阵列:
tvalue = 1306 -->段错误
2( 包括 free(目标阵列(:
tvalue = 29 free((:下一个大小无效(快速( 已中止(核心已转储(
3( 包括 free(targetarray( 并为 tvaluearray calloc 分配 4*sizeof(int(,而不仅仅是 int:
tvalue = 31468 -->段错误
第三个测试让我更改数组的分配空间,在我的程序遇到分段错误之前,结果各不相同。这让我想到我分配空间的方式存在问题,但我认为这可能有点超出我目前的理解。你们有没有人看到我可能出错的地方?
在frequencyArray()
函数中,你有一个循环:
while (target > 1) {
if (target % divisor == 0) {
targetarray[divisor] += 1;
target /= divisor;
}
else
++divisor;
}
其中divisor
用作targetarray[]
的索引。我在这里看不到divisor
最大值的任何正式界限 - 似乎它可以超过最大允许值(等于allnum - 1
(,因此可以覆盖targetarray[]
之外的内存,从而导致内存损坏/分段错误。您应该签入divisor < allnum
的每个迭代。
不幸的是,我不知道您的代码的上下文,因此无法在这里提出任何适当的解决方案。可能它应该看起来像:
while (target > 1) {
if (target % divisor == 0) {
// 'fuse' ;)
if (divisor >= allnum) {
// place here the code needed to solve the problem or break to exit from loop
}
// end of 'fuse'
targetarray[divisor] += 1;
target /= divisor;
}
else
++divisor;
}