遇到内存泄漏问题
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);
换句话说:不要在 main
和 fib2
中都做 malloc
。 Select一位。
问题 3 在 fib2
中 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
做其他事情,我建议您将 malloc
和 free
移动到fib2
根据 OP
的评论进行编辑
OP 在评论中讲述了一些限制,例如:
必须使用malloc
只允许 malloc
2 个整数(我假设这也意味着 fib2
中不允许使用局部变量)
函数原型必须是void fib2(int* a)
必须打印小于或等于 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");
}
我试图通过为 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);
换句话说:不要在 main
和 fib2
中都做 malloc
。 Select一位。
问题 3 在 fib2
中 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
做其他事情,我建议您将 malloc
和 free
移动到fib2
根据 OP
的评论进行编辑OP 在评论中讲述了一些限制,例如:
必须使用
malloc
只允许
malloc
2 个整数(我假设这也意味着fib2
中不允许使用局部变量)函数原型必须是
void fib2(int* a)
必须打印小于或等于 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");
}