我为嵌入式系统编写了这段相当大的代码,其中一个函数用于计算并为循环中的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);
OR
while (i--) {
arr[num - i] = i;
}
free(arr);
答案 0 :(得分:4)
你的第二个循环
while (i--)
{
arr[num - i] = i;
printf("i = %d, num - i = %d, arr = %d\t", i, num - i, arr[num - i]);
}
由于i
的后递减导致问题您从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);
答案 1 :(得分: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);
答案 2 :(得分:0)
另一个问题是,当用户为num
输入负值时,您的while循环可以变为无限,因为-1
或任何其他负值评估为True
。如果i
超出您分配的内存的边界(较低或较高),它也可能导致分段错误。