必须做什么
我的函数被赋予一个包含 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)
花几个小时查看代码对调试没有帮助,但投入一些工作却可以。
在每个 nuovon 之前添加
free
printf("I am freeing nuovon in line %d\n", __LINE__);
以及在每个 nuovon 之前
malloc
printf("I am allocating nuovon in line %d\n", __LINE__);
看看打印了什么。