c - 内存泄漏示例的问题

标签 c memory-leaks

下面的这行代码是我们在类里面讨论过的潜在内存泄漏的示例。

我无法逻辑地遵循代码来获取输出。

当我逐行浏览它时,我认为输出应该是 "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/

相关文章:

c - 使用指针设置操作

c - 变量在 if else 循环之前正确打印,但在 if else 循环中不保留该值

c - 在某些测试用例之后,堆被损坏

c++ - 为什么 float 可以比较?

c - 为什么我不能使用动态分配的字符串创建临时文件?

ios - Cordova 应用程序在 safari 上运行良好,但作为应用程序安装时崩溃

java - Java 中的内存泄漏(在 while 循环中)

WCF 服务内存泄漏

java - 为什么 webappclassloader 没有被垃圾回收?

C:使用floodfill填充一个圆