释放内存时出错

时间:2015-07-27 16:21:23

标签: c

我正在编写一些代码来计算最多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时,我得到一个核心转储。

4 个答案:

答案 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));

why you should not cast the return value of malloc上查看SO帖子。

答案 1 :(得分:1)

有很多问题 -

  1. i未在main中声明。
  2. n未在main中声明。
  3. 最重要的一个是这个循环 -

     for(i = 0; i <= n; i++)
    
  4. 在为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);sumlong返回fib(),因此将函数defalcation long *更改为{{1} }}

我更新您的代码,然后run并获得输出: 12

修改后的代码:

long *fib(long *fibs, int n)