-1
下面的这行代码是我们在课堂上发现的潜在内存泄漏的示例。内存泄漏示例中的问题
我无法按照逻辑代码来获取输出。
当我逐行浏览它时,我认为输出应该是"Sucess!! val1 -> 10, val2 -> 10"
,但运行代码时的实际输出是"Abort System - ERROR!! val1 -> 10, val2 -> 108"
。
看来,当foo2
被调用的第二次它覆盖的第一个元素数组中与100
值我猜我不理解的是如何在foo1
的int 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;
}
难道你不是在foo1中返回x的地址吗?! – auserdude
您正在引用超出范围的局部变量,这可能会导致异常,并且通常是不正确的做法。我没有看到内存会“泄漏”。也许这将被归类为免费后访问。 – hsmiths
没有'malloc()'或更低级别的分配函数(如'sbrk()'),程序中就不会有内存泄漏。 –