C 释放内存时出错
我正在编写一些代码来计算存储在数组中的fibonacci值之和,最大为n。对于n的某些值,调用free()时出错 编辑:这段代码现在应该可以编译了C 释放内存时出错,c,C,我正在编写一些代码来计算存储在数组中的fibonacci值之和,最大为n。对于n的某些值,调用free()时出错 编辑:这段代码现在应该可以编译了 #include <stdio.h> #include <stdlib.h> #include <string.h> long fib(long *fibs, int n); int main(int argc, char *argv[]) { long num, sum; long n; lon
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
long fib(long *fibs, int n);
int main(int argc, char *argv[]) {
long num, sum;
long n;
long *fibs;
if(argc < 2) {
printf("Usage %s n\n", argv[0]);
exit(EXIT_SUCCESS);
}
n = strtol(argv[1], NULL, 10);
printf("%ld\n", n);
printf("--Allocating memory\n");
fibs = (long *) malloc(sizeof(long) * n);
printf("--Memory allocated\n");
fibs[0] = 1;
fibs[1] = 1;
sum = 0;
for(int i = 0; i <= n; i++) {
num = fib(fibs, i);
sum += num;
printf("%ld\n", num);
}
printf("%ld\n", sum);
printf("--Freeing memory\n");
free(fibs);
printf("--Memory freed\n");
}
long fib(long *fibs, int n) {
if((n == 0) || (n == 1)) {
return 1;
}
fibs[n] = fibs[n - 1] + fibs[n - 2];
return fibs[n];
}
#包括
#包括
#包括
长fib(长*fibs,int n);
int main(int argc,char*argv[]){
long num,sum;
长n;
长*小谎;
如果(argc<2){
printf(“用法%s n\n”,argv[0]);
退出(退出成功);
}
n=strtol(argv[1],NULL,10);
printf(“%ld\n”,n);
printf(“--分配内存\n”);
fibs=(长*)malloc(长)*n;
printf(“--Memory allocated\n”);
fibs[0]=1;
fibs[1]=1;
总和=0;
对于(inti=0;i
fibs[n] = 1;
及
修改超出合法范围的内存。合法范围是fibs[0]
-fibs[n-1]
。因此,程序显示未定义的行为。在您的情况下,未定义的行为以问题的形式显示在对free
的调用中
您可能希望比当前分配的元素多分配一个元素。而不是
fibs = (long *) malloc(n * sizeof(n));
使用
请参阅上的SO帖子。存在许多问题-
i
未在main
中声明
n
未在main
中声明
最重要的是这个循环-
for(i = 0; i <= n; i++)
for(i=0;i您的代码中几乎没有问题,我想有些是输入错误,有些是逻辑问题:
- 您忘记键入
n
和i
- 永远不要施放
malloc
,所以不要施放fibs=(long*)malloc(n*sizeof(n));
试试fibs=malloc(n*sizeof(long));
- 在for循环中,而不是
for(i=0;i就像我在评论中告诉你的那样,当你使用主代码中的n
时,你的代码溢出了吗?请发布一个最小的可编译代码,你的代码中有很多问题,不要抛出malloc的返回值。你应该在声明它时初始化fibs。此外,这并没有声明i,所以我不确定它是如何编译代码的,如图所示。)不编译。您可能应该使用malloc(n*sizeof(long))
而不是malloc(n*sizeof(n))
。为什么他使用if((n==0)|(n==1))这意味着n-1将是索引1,n-2将是索引0,或者我是否丢失了something@CamelToe,我没有听你的问题。如何修改超出法定范围的内存@RSahu@rakeb.void,则main
中的for
循环从0
到n
,而不是0
到n-1
。因此,发布的代码将修改fibs[n]
。不要投射malloc
结果,这是不必要的!
fibs = malloc((n+1) * sizeof(n));
for(i = 0; i <= n; i++)
#include <stdio.h>
#include <stdlib.h>
long fib(long *fibs, int n) {
if((n == 0) || (n == 1)) {
fibs[n] = 1;
} else {
fibs[n] = fibs[n - 1] + fibs[n - 2];
}
return fibs[n];
}
int main(int argc, char *argv[]) {
long *fibs;
long sum = 0;
int n = 6, i;
fibs = malloc(n * sizeof(long));
long tem;
for(i = 0; i < n; i++) {
tem = fib(fibs, i);
sum += tem;
}
printf("%ld\n", sum);
free(fibs);
}
#include <stdio.h>
#include <stdlib.h>
int number = 300;
long* fib(long* fibs, int n)
{
if (n == 0 || n == 1)
{
fibs[n] = 1;
}
else
{
fibs[n] = (fibs[n-1] + fibs[n-2]);
}
return fibs;
}
int main(int argc, char *argv[])
{
long* fibs = (long*)malloc(number * sizeof(long));
long sum = 0;
for (int i = 0; i < number; ++i) //changed <= to < like i said in the comments
{
sum += fib(fibs, i)[i];
printf("%d\n", sum);
}
printf("\n\nSum of everything: %ld\n", sum);
free(fibs); //no problem
return 0;
}