C 错误 free():在数组操作中的 tcache 2 中检测到双重释放

问题描述 投票:0回答:1

必须做什么

我的函数被赋予一个包含 n 个数字的数组,并且应该创建并返回一个新数组,其内容取决于参数 k:

如果 k>0,新数组必须包含连续重复 k 次的每个数字;例如,如果 a=[1 0 8 2] 且 k=3,则新数组必须为 [1 1 1 0 0 0 8 8 8 2 2 2]

如果 k=0,新数组必须与 a 具有相同的长度,但仅包含零;例如,如果 a=[1 0 8 2] 且 k=0,则新数组必须为 [0 0 0 0]

如果k<0 the new array must contain each element of a repeated k times but in reverse order; for example if a=[1 0 8 2] and k=-2 the new array must be [2 2 8 8 0 0 1 1]

该函数必须返回指向结果数组第一个元素的指针,并将其长度存储在 *newn 中。

main函数必须从命令行读取输入文件的名称和一系列整数integer1,integer2,...integerK,然后将输入文件中存储的整数读取到数组中(如果没有则终止) 对于命令行上的每个整数,它调用

elabora
函数,向其传递数组和整数,并将详细返回的数组元素写入标准输出。程序不应将任何其他内容打印到 stdout,在 stderr 中打印调试消息 例如,如果通过编写来调用程序

main test1 2 0 -1
并且 infile 包含整数 2 0 5 1 程序必须打印 3 行 2 2 0 0 5 5 1 1 0 0 0 0 1 5 0 2

程序必须关闭所有文件并释放所有已使用的内存。

这是我的代码

#define _GNU_SOURCE 
#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 
#include <assert.h>   
#include <string.h>   
#include <errno.h>


void termina(const char *messaggio);

int *elabora(int a[], int n, int k, int *nuovon) {
  int c = 0;
  
  nuovon = malloc(n*sizeof(int));
  if(nuovon==NULL) termina("Memoria insufficiente");
  
  for(int i=0; i<n; i++) {
    if(k>0) {
      for(int j=0; j<k; j++) {
        while (c<=k) {
          nuovon[c]=a[j];
          c++;
        }
      }
    } else if(k==0) {
      nuovon[c] = 0;
      c++;
    } else {
      for(int j=k-1; j>=0; j--) {
        nuovon[c]=a[j];
        c++;
      }
    }
  }
  free(nuovon);
  return nuovon;
  *nuovon = n*k;
}

int main(int argc, char *argv[])
{

  if(argc<2) {
      fprintf(stderr, "Uso: %s i1 [i2 i3 ...]\n", argv[0]);
      exit(1);
  }
  
  int n = 10;
  int *nuovon = NULL;
  int k = atoi(argv[2]);
  int i;
  int *a = malloc(n*sizeof(int));
  if(a==NULL) termina("Memoria insufficiente");
  
  // lettura file
  FILE *f = fopen(argv[1], "r");
  if(f==NULL) termina("Impossibile aprire il file di inpt");
  // lettura interi
  int e = fscanf(f, "%d", &n);
  if(e!=1) {
    termina("Non ci sono interi nel file");
    fprintf(stderr, "Errore di lettura nella riga %d\n", i);
  }
  //chiusura file
  fclose(f);
  if(fclose(f)!=0) termina ("Errore di chiusura del file di input");

  for(int i=2; i<argc; i++) {
    nuovon = elabora(a, n, k, nuovon);
    for(int j=0; j<n*k; j++) {
        fprintf(stdout, "%d", nuovon[j]);
    }
  }
  free(nuovon);
  free(a);
  return 0;
}

void termina(const char *messaggio){
  if(errno!=0) perror(messaggio);
    else fprintf(stderr,"%s\n", messaggio);
  exit(1);
}

错误

当我运行它时

main test1 2 0 5 1
没有给我任何警告,因为我修复了它们,但无法读取文件中的那几个数字,似乎内存有问题。

free(): double free detected in tcache 2
Aborted (core dumped)
arrays c parameter-passing
1个回答
0
投票

花几个小时查看代码对调试没有帮助,但投入一些工作却可以。

在每个 nuovon 之前添加

free

printf("I am freeing nuovon in line %d\n", __LINE__);

以及在每个 nuovon 之前

malloc

printf("I am allocating nuovon in line %d\n", __LINE__);

看看打印了什么。

© www.soinside.com 2019 - 2024. All rights reserved.