下面这行代码是我们在课堂上经历的潜在内存泄漏的一个例子。
我无法逻辑地遵循代码来获取输出。
当我逐行浏览时,我认为输出应为"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;
}
答案 0 :(得分:1)
在您的函数foo1
int* foo1(int a, int b)
{
int *ptr, x;
ptr = &x;
x = a * b;
return ptr;
}
您将返回x
的地址,但此变量的范围在函数foo1
内。一旦此函数返回并且您取消引用指向x
的指针,您基本上就是访问未编组的变量。
这会导致不可预测的行为。