遇到内存泄漏问题

Having trouble with memory leak

我试图通过为 2 个元素分配 space 来生成斐波那契数列,所以我需要我的数组 a[0]a[1] 不断更新,直到它输出 89 作为最终数字。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

void fib2(int* a);

int main()
{
  int *pointer;

  //allocates space for 2 elements for pointer
  pointer = (int*)malloc(2 * sizeof(int*));

  //prints first two fibonacci values
  printf("0 1 ");

  //calls fib2 func and apsses pointer into it
  fib2(pointer);

  //frees pointer memory
  free(pointer);

  printf("\n");

  return 0;
}

//generates fibonacci sequence
void fib2(int* a)
{
  int i;

  //allocates space for 2 elements
  a = (int*)malloc(2 * sizeof(int*));
  //initial fibonacci array initialized
  a[0] = 0;
  a[1] = 1;

  //generates and calculates fibonacci sequence and prints
  for(i = 2; i < 12; i++)
  {
    a[i] = a[i - 1] + a[i - 2];
    printf("%d ", a[i]);

  }

}

我尝试通过 free(a); 释放 a[] 但它输出到控制台是这样的

**编辑这是 valgrind 输出

有很多问题。

问题1错误malloc

int *pointer;

//allocates space for 2 elements for pointer
pointer = (int*)malloc(2 * sizeof(int*));
                           ^^^^^^^^^^^^

sizeof 应该是 sizeof(int),因为您要为数字 (2) int 分配 space。除此之外,您不需要演员表。更好的写法是:

pointer = malloc(2 * sizeof *pointer);

问题 2 你从不使用 pointer 做任何事情

您将它的值传递给 fib2,以便它的值进入变量 a。但是,在您这样做之后立即:

a = (int*)malloc(2 * sizeof(int*));  // also sizeof wrong again

所以你实际上覆盖了传递的任何值。您对 fib2 的调用也可以是:

fib2(NULL);

换句话说:不要在 mainfib2 中都做 malloc。 Select一位。

问题 3fib2 中 malloc'ed 的内存永远不会被释放

您当前的代码泄漏内存,因为 fib2 没有以这样的代码结尾:free(a);

问题4你分配的内存太少

显然你想要整数数组中的 12 个元素,但你只分配了!将代码更改为:

a = malloc(12 * sizeof *a);

把东西放在一起可能看起来:

#include <stdio.h>
#include <stdlib.h>

void fib2(int* a, int n);

#define NUMBERS_TO_CALCULATE 12

int main()
{
  int *pointer;

  //allocates space for NUMBERS_TO_CALCULATE elements for pointer
  pointer = malloc(NUMBERS_TO_CALCULATE * sizeof *pointer);
  if (pointer == NULL) exit(1);

  //calls fib2 func and apsses pointer into it
  fib2(pointer, NUMBERS_TO_CALCULATE);

  // ... use pointer for other things ...

  //frees pointer memory
  free(pointer);

  return 0;
}

//generates fibonacci sequence
void fib2(int* a, int n)
{
  int i;

  if (n < 2) return;

  //initial fibonacci array initialized
  a[0] = 0;
  a[1] = 1;

  //prints first two fibonacci values
  printf("0 1 ");


  //generates and calculates fibonacci sequence and prints
  for(i = 2; i < n; i++)
  {
    a[i] = a[i - 1] + a[i - 2];
    printf("%d ", a[i]);
  }

  printf("\n");    
}

注意:如果您不想在 main 中使用 pointer 做其他事情,我建议您将 mallocfree 移动到fib2

根据 OP

的评论进行编辑

OP 在评论中讲述了一些限制,例如:

  1. 必须使用malloc

  2. 只允许 malloc 2 个整数(我假设这也意味着 fib2 中不允许使用局部变量)

  3. 函数原型必须是void fib2(int* a)

  4. 必须打印小于或等于 89 的值

有了这些限制,程序可能看起来像:

#include <stdio.h>
#include <stdlib.h>

void fib2(int* a);

int main()
{
  int *pointer;

  //allocates space for 2 integer elements for pointer
  pointer = malloc(2 * sizeof *pointer);
  if (pointer == NULL) exit(1);

  //initialize fibonacci start values
  pointer[0] = 0;
  pointer[1] = 1;

  //calls fib2 func and apsses pointer into it
  fib2(pointer);

  //frees pointer memory
  free(pointer);

  return 0;
}

//generates fibonacci sequence
void fib2(int* a)
{
  //prints first two fibonacci values
  printf("%d %d ", a[0], a[1]);


  //generates and calculates fibonacci sequence and prints
  while(a[1] < 89)
  {
    a[1] = a[1] + a[0];   // Calculate next number and save in a[1]
    printf("%d ", a[1]);  // Print it
    a[0] = a[1] - a[0];   // Calculate the number for a[0]
  }

  printf("\n");
}