内存泄漏示例的问题

时间:2017-09-13 22:58:35

标签: c memory-leaks

下面这行代码是我们在课堂上经历的潜在内存泄漏的一个例子。

我无法逻辑地遵循代码来获取输出。

当我逐行浏览时,我认为输出应为"Sucess!! val1 -> 10, val2 -> 10",但运行代码时的实际输出为"Abort System - ERROR!! val1 -> 10, val2 -> 108"

当第foo2次被调用时,它会覆盖数组中第一个元素值为100.

我想我不理解的是int x中的foo1如何与int x[10]中的数组foo2相关联。这些不是彼此联系的,因为它们都是在本地宣布的吗?

#include <stdio.h>
#include <stdlib.h>


int* foo1(int a, int b)
{
   int *ptr, x;

   ptr = &x;
   x = a * b;
   return ptr;
}

int foo2(int a, int b)
{
   int i, c, x[10];

   for (i=0; i < 10; i++) x[i] = 100;

   c = a + b;
   return c;
}


int main(void)
{
   int *ptr;
   int i, val;
   int val1, val2;

   for (i = 1; i <= 2; i++) 
   {
      if (i % 2) {
         val = foo2(3, 5);
         ptr = foo1(1, 2);
         val1 = val + *ptr;
      }
      else {
         ptr = foo1(1, 2);
         val = foo2(3, 5);
         val2 = val + *ptr;
      }
   }

   if (val1 != val2) {
      printf("Abort System - ERROR!!\n");
   }
   else {
      printf("Sucess!!\n");
   }
   printf("val1 -> %i, val2 -> %i\n", val1, val2);

   return 0;  
}

1 个答案:

答案 0 :(得分:1)

在您的函数foo1

int* foo1(int a, int b)
{
   int *ptr, x;

   ptr = &x;
   x = a * b;
   return ptr;
}

您将返回x的地址,但此变量的范围在函数foo1内。一旦此函数返回并且您取消引用指向x的指针,您基本上就是访问未编组的变量。

这会导致不可预测的行为。