循环内存初始化:免费分段故障

时间:2012-11-23 05:58:09

标签: c memory-leaks free

我为嵌入式系统编写了这段相当大的代码,其中一个函数用于计算并为循环中的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);

3 个答案:

答案 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超出您分配的内存的边界(较低或较高),它也可能导致分段错误。