Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 内存泄漏示例的问题_C_Memory Leaks - Fatal编程技术网

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;i
foo1

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
。您所做的是在对象被销毁后访问它,这是非常不同的。可以吗建议你停止猜测,开始阅读?