C 释放内存时出错

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

我正在编写一些代码来计算存储在数组中的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;
  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;
      }