2017-09-13 80 views
-1

下面的这行代码是我们在课堂上发现的潜在内存泄漏的示例。内存泄漏示例中的问题

我无法按照逻辑代码来获取输出。

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

看来,当foo2被调用的第二次它覆盖的第一个元素数组中与100

值我猜我不理解的是如何在foo1int x链接到阵列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; 
} 
+0

难道你不是在foo1中返回x的地址吗?! – auserdude

+0

您正在引用超出范围的局部变量,这可能会导致异常,并且通常是不正确的做法。我没有看到内存会“泄漏”。也许这将被归类为免费后访问。 – hsmiths

+0

没有'malloc()'或更低级别的分配函数(如'sbrk()'),程序中就不会有内存泄漏。 –

回答

1

在你的函数foo1

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

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

您正在返回的x的地址,但这个变量的作用域是函数foo1内。一旦这个函数返回并且你将指针解引用到x你基本上访问一个unscoped变量。

这导致不可预知的行为。