C语言 分段错误(环路中的故障/自由)



我一直在重新访问 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;
}

相关内容

  • 没有找到相关文章

最新更新