我正在编写一些代码来计算最多n的fibonacci值之和,存储在数组中。对于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;
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];
}
例如,当我用n = 5调用程序./fibsum时,我得到一个核心转储。
答案 0 :(得分:2)
行
fibs[n] = 1;
和
fibs[n] = fibs[n - 1] + fibs[n - 2];
修改超出法定范围的内存。合法范围是fibs[0]
- fibs[n-1]
。因此,程序显示未定义的行为。在您的情况下,未定义的行为在调用free
时会以问题的形式出现。
您可能希望分配比当前分配的元素多一个元素。而不是
fibs = (long *) malloc(n * sizeof(n));
使用
fibs = malloc((n+1) * sizeof(n));
答案 1 :(得分:1)
有很多问题 -
i
未在main
中声明。n
未在main
中声明。最重要的一个是这个循环 -
for(i = 0; i <= n; i++)
在为n
项目分配内存但循环从0
转到n
时。您忘记它应该是n-1
。因此行为未定义。
如您描述的情况(n=5
所以循环应来自0 to 4
)。
答案 2 :(得分:1)
就像我在评论中告诉你的那样,当你使用&lt; =而不是&lt;在循环。看一下下面的例子,这绝不是试图成为一个&#34;清理&#34;你的代码版本,我只是让它工作而不会改变太多。
#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;
}
答案 3 :(得分:0)
您的代码中存在一些问题,有些是输入错误我猜,有些是逻辑问题:
您忘记输入DirectoryIndex index.php
RewriteEngine on
RewriteRule ^$ index.php
#ErrorDocument 400 /400.html
#ErrorDocument 401 /401.html
ErrorDocument 403 /errs/404.php
ErrorDocument 404 /errs/404.php
#ErrorDocument 500 /500.html
Options -Indexes
和n
从不投射i
,而不是malloc
尝试fibs = (long *) malloc(n * sizeof(n));
在for循环中,而不是fibs = malloc(n * sizeof(long));
使用for(i = 0; i <= n; i++)
for(i = 0; i < n; i++)
此处,sum += fib(fibs, i);
为sum
但long
返回fib()
,因此将函数defalcation long *
更改为{{1} }}
我更新您的代码,然后run并获得输出: 12 。
修改后的代码:
long *fib(long *fibs, int n)