C 内存泄漏示例的问题
下面这行代码是我们在课堂上讨论过的潜在内存泄漏的一个例子 我无法逻辑地按照代码获得输出 当我逐行检查它时,我认为输出应该是C 内存泄漏示例的问题,c,memory-leaks,C,Memory Leaks,下面这行代码是我们在课堂上讨论过的潜在内存泄漏的一个例子 我无法逻辑地按照代码获得输出 当我逐行检查它时,我认为输出应该是“success!!val1->10,val2->10”,但运行代码时的实际输出是“Abort System-ERROR!!val1->10,val2->108” 看起来,当第二次调用foo2时,它会用值100覆盖数组中的第一个元素 我想我不理解的是foo1中的intx是如何链接到foo2中的数组intx[10]的。因为它们都是本地声明的,所以它们不应该相互链接吗 #incl
“success!!val1->10,val2->10”
,但运行代码时的实际输出是“Abort System-ERROR!!val1->10,val2->108”
看起来,当第二次调用foo2
时,它会用值100覆盖数组中的第一个元素
我想我不理解的是foo1
中的intx
是如何链接到foo2
中的数组intx[10]
的。因为它们都是本地声明的,所以它们不应该相互链接吗
#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;
}
#包括
#包括
int*foo1(int a,int b)
{
int*ptr,x;
ptr=&x;
x=a*b;
返回ptr;
}
int foo2(int a,int b)
{
int i,c,x[10];
对于(i=0;i<10;i++)x[i]=100;
c=a+b;
返回c;
}
内部主(空)
{
int*ptr;
int i,val;
int val1,val2;
对于函数中的(i=1;ifoo1
int* foo1(int a, int b)
{
int *ptr, x;
ptr = &x;
x = a * b;
return ptr;
}
您返回的是x
的地址,但此变量的作用域在函数foo1
中。一旦此函数返回并取消对x
的引用,您基本上是在访问一个非作用域变量
这会导致一个不可预测的行为。您不是在foo1中返回x的地址吗?!您引用的是一个超出范围的局部变量,这可能会导致异常,通常是不好的做法。我看不出内存会在哪里“泄漏”。这可能被归类为释放后访问。如果没有malloc()
或像sbrk()这样的低级分配函数,程序中就不会有内存泄漏
。问题是您在foo1
中返回一个指向x
的指针,但x仅在foo1
中有作用域。这不是内存泄漏。当您malloc
时会发生内存泄漏,但随后忽略了free
。您所做的是在对象被销毁后访问它,这是非常不同的。可以吗建议你停止猜测,开始阅读?