下面的这行代码是我们在类里面讨论过的潜在内存泄漏的示例。
我无法逻辑地遵循代码来获取输出。
当我逐行浏览它时,我认为输出应该是 "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;
}
最佳答案
在你的函数foo1
int* foo1(int a, int b)
{
int *ptr, x;
ptr = &x;
x = a * b;
return ptr;
}
您正在返回x
的地址,但该变量的作用域在函数foo1
内。一旦这个函数返回并且您取消引用指向 x 的指针,您基本上就在访问一个无作用域的变量。
这会导致不可预测行为。
关于c - 内存泄漏示例的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46208047/