0

我为嵌入式系统编写了一段相当大的代码,其中一个函数用于在循环中计算和分配值给 calloc 结构。我在代码中遇到了一个错误,我花了一些时间来隔离和修复。如果需要,我想看看其他人是否可以在分享我的经验之前指出错误。

声明块:

int *arr;
int i, num;
printf("Enter number of elements: ");
scanf("%d", &num); //Assume num>=0
arr = calloc(num, sizeof(int));
if (arr == NULL)
    return;
i = num;

以下哪个代码块/代码块将在调用 free() 时引发异常,为什么?

for (i; i > 0; i--) {
    arr[num - i] = i;
}
free(arr);

或者

while (i--) {
    arr[num - i] = i;
}
free(arr);
4

3 回答 3

4

你的第二个循环

while (i--) 
{
  arr[num - i] = i;
  printf("i = %d, num - i = %d, arr = %d\t", i, num - i, arr[num - i]);
}

由于 i 的 postdecrement 导致问题

你开始了,i == 10所以第一个任务是arr[10 - 9] = 9;当i到达1哪个是你得到的最后一个循环arr[10 - 0] = 0

并导致赋值写入数组范围 0..9 之外

如果您像这样编写while循环,它应该可以工作

do 
{
  arr[num - i] = i;
  printf("i = %d, num - i = %d, arr = %d\t", i, num - i, arr[num - i]);
}
while (--i);
于 2012-11-23T06:25:33.207 回答
2

for是正确的,但while循环有问题

试试这个简单的:

    for(i=0;i<num;i++)
       arr[i]=i;
    free(arr);

    i=0;
    while(i<num)
       {
       arr[i]=i;
       i++;
      }
    free(arr);
于 2012-11-23T06:24:20.517 回答
0

另一个问题是,当用户为 输入负值时num,您的 while 循环可能会变为无限,因为-1或任何其他负值的计算结果为Truei如果超出您分配的内存的边界(下限或上限),也可能导致分段错误。

于 2012-11-23T07:08:00.090 回答