【问题标题】:free(): invalid next size(normal)free():下一个尺寸无效(正常)
【发布时间】:2015-10-15 21:48:27
【问题描述】:

当使用包含 200-300 个整数(由空格分隔)的输入 .txt 文件运行此代码时,我在使用 fprintf 语句的 for 循环之前遇到错误。

我不确定 qsort 是否会导致此错误或发生此错误的原因,但我们将不胜感激。

(此文件通过在命令行中添加输入文件和输出文件的名称来运行例如:./program input.txt output.txt

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}

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

    if(argc != 3){
        printf("\nInvalid input\nPlease provide the input and output text file names as %s name1 name2\n", argv[0]);
    }else{

    printf("\nPart A: \n");
    printf("..............................................................................................................\n\n");

    char *fn1 = argv[1];  //variables
    char *fn2 = argv[2]; 

    int temp = 0;
    int counter = 0;
    int index = 0;
    int index2 = 0;
    int sort = 0;


    FILE *fp1 = fopen(fn1, "r"); //read file
    FILE  *fp2 = fopen(fn2, "w"); //write file

    if(fp1 == NULL){  //test if fp1 was opened
        printf("There was an error opening the input file");
    }

     char data[10]; //ints can only hold 10 digits
     int *integerArr;
     int *tempPointer;

    integerArr = malloc(10*sizeof(int));

     int sizeOfArrs = 10;

    printf("Reading in the textfile: ");

     while(fscanf(fp1,"%s",data) != EOF){  //reads in the file breaking on each whitespace and ends at the EOF pointer

  temp = strlen(data);
  if(temp <=10){
    temp = atoi(data);
    integerArr[counter] = temp;

    printf(".");

    counter++;
    if(counter == sizeOfArrs -1){

        temp = sizeOfArrs * 2;

        tempPointer = realloc(integerArr, temp);

        if(tempPointer != NULL){
            integerArr = tempPointer;
        }

    }
  }else printf("\ninteger had too many digits\n");


    }


     printf(" Done\n%d Numbers were found\n",  counter);
     printf("The integers found in the %s file: \n", argv[1]);

        index = 0;  //reset index to 0;
    for(index;index<counter;index++){  //prints the unsorted contents of the file
        printf("%d ", integerArr[index]);
    }

    printf("\n\nPart B\n");
    printf("..............................................................................................................\n\n");


    printf("The integers found in the %s file after sorting: \n", argv[1]);

     qsort(integerArr, counter, sizeof(int), cmpfunc); //best function ever (sorts the array using the cmpfunc to tell if an integer is greater than less than or equal to the next one)

    index = 0; //resets the index
    for(index; index <counter; index++){ //prints the sorted contents of the file
        printf("%d ", integerArr[index]);

        fprintf(fp2,"%d ",integerArr[index]); //writes the sorted integers to the new file
    }

    if(fp2 == NULL){ //tests if the write worked
        printf("There was an error writing the outputfile");

    }

    printf("\n");
    close(fp1,fp2); //closes both files
    }
return 0;
}

【问题讨论】:

  • 你设置断点了吗?调试了吗?输入数据集是什么?你验证你的来源了吗?
  • 0) if(counter == sizeOfArrs -1){ --> if(counter == sizeOfArrs){ 1) temp = sizeOfArrs * 2; --> temp = sizeof(int) * sizeOfArrs * 2;
  • 3) 添加sizeOfArrs *= 2;

标签: c free qsort


【解决方案1】:

您的 fscanf 循环已损坏。你实际上并没有重新分配更大的尺寸。这是更正后的程序 [对不起,书呆子风格的重新编辑,但你碰到了我的一个缺点:长边栏 cmets]

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

int
cmpfunc(const void *a, const void *b)
{
    return (*(int *) a - *(int *) b);
}

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

    if (argc != 3) {
        printf("\nInvalid input\nPlease provide the input and output text file names as %s name1 name2\n", argv[0]);
        return 1;
    }

    printf("\nPart A: \n");
    printf("..............................................................................................................\n\n");

    char *fn1 = argv[1];            // variables
    char *fn2 = argv[2];

    int temp = 0;
    int counter = 0;
    int index = 0;
    int index2 = 0;
    int sort = 0;

    FILE *fp1 = fopen(fn1, "r");
    FILE *fp2 = fopen(fn2, "w");

    // test if fp1 was opened
    if (fp1 == NULL) {
        printf("There was an error opening the input file");
        return 1;
    }

    // ints can only hold 10 digits
    char data[10];
    int *integerArr;
    int *tempPointer;

    int sizeOfArrs = 10;
    integerArr = malloc(sizeOfArrs * sizeof(int));

    printf("Reading in the textfile: ");

    // reads in the file breaking on each whitespace and ends at the EOF
    // pointer
    while (fscanf(fp1, "%s", data) != EOF) {
        temp = strlen(data);
        if (temp > 10) {
            printf("\ninteger had too many digits\n");
            continue;
        }

        temp = atoi(data);
        integerArr[counter] = temp;

        printf(".");

        counter++;
        if (counter == sizeOfArrs - 1) {
            sizeOfArrs += 600;
            integerArr = realloc(integerArr, sizeOfArrs * sizeof(int));
        }
    }

    // trim array to actual size needed
    sizeOfArrs = counter;
    integerArr = realloc(integerArr, sizeOfArrs * sizeof(int));

    printf(" Done\n%d Numbers were found\n", counter);
    printf("The integers found in the %s file: \n", argv[1]);

    // prints the unsorted contents of the file
    for (index = 0; index < counter; index++) {
        printf("%d ", integerArr[index]);
    }

    printf("\n\nPart B\n");
    printf("..............................................................................................................\n\n");

    printf("The integers found in the %s file after sorting: \n", argv[1]);

    // best function ever (sorts the array using the cmpfunc to tell if an
    // integer is greater than less than or equal to the next one)
    qsort(integerArr, counter, sizeof(int), cmpfunc);

    // prints the sorted contents of the file
    for (index = 0; index < counter; index++) {
        printf("%d ", integerArr[index]);

        // writes the sorted integers to the new file
        fprintf(fp2, "%d ", integerArr[index]);
    }

    // tests if the write worked
    if (fp2 == NULL) {
        printf("There was an error writing the outputfile");

    }

    printf("\n");

    // closes both files
    fclose(fp1);
    fclose(fp2);

    return 0;
}

另外,请注意底部的 fclose。有一些小错误供您查找。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多