rt3 发表于 2023-1-24 20:49:59

Linux C语言编程调用fclose()报错

报错信息是
munmap_chunk(): invalid pointer


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

int main(){

    char* home=malloc(sizeof(char)*30);
    strcpy(home,getenv("HOME"));

    char* abc1=malloc(sizeof(char)*30);
    char* abc2=malloc(sizeof(char)*30);

    sprintf(abc1,"%s/goal",home);
    FILE* abc3=fopen(abc1,"r+");
    if(NULL==abc3){
      fprintf(stderr,"open file failed.L1\n");
      return -1;
    }

    fscanf(abc3,"%s",abc2);
    fprintf(stdout,"abc2==%s\n",abc2);
    fclose(abc3);

   free(home);
   home=NULL;
   free(abc1);
   abc1=NULL;
   free(abc2);
   abc2=NULL;
    return 0;
}
   

   


谢谢

人造人 发表于 2023-1-24 20:50:00

rt3 发表于 2023-1-24 21:45
本来在程序开头定义的。但是在提交上来以前把相关的代码删了,不然代码会非常长

不知道你那边是什么情况,我只能说应该不是这个代码的问题

人造人 发表于 2023-1-24 21:22:24

这程序没有问题吧?是不是缓冲区太小,溢出了?
你是如何判断出是调用fclose报错的?

sh-5.1$ cat main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    char *home = malloc(sizeof(char) * 1024);
    strcpy(home, getenv("HOME"));

    char *abc1 = malloc(sizeof(char) * 1024);
    char *abc2 = malloc(sizeof(char) * 1024);

    sprintf(abc1, "%s/goal", home);
    FILE *abc3 = fopen(abc1, "r+");
    if(NULL == abc3) {
      fprintf(stderr, "open file failed.L1\n");
      // memory leaks
      free(abc2);
      free(abc1);
      free(home);
      return -1;
    }

    fscanf(abc3, "%s", abc2);
    fprintf(stdout, "abc2==%s\n", abc2);
    fclose(abc3);

    free(home);
    home = NULL;
    free(abc1);
    abc1 = NULL;
    free(abc2);
    abc2 = NULL;
    return 0;
}
sh-5.1$ ./main
abc2==hello
sh-5.1$

人造人 发表于 2023-1-24 21:23:24

另外,请记住 sizeof(char) == 1

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

int main() {
    char *home = malloc(1024);
    strcpy(home, getenv("HOME"));

    char *abc1 = malloc(1024);
    char *abc2 = malloc(1024);

    sprintf(abc1, "%s/goal", home);
    FILE *abc3 = fopen(abc1, "r+");
    if(NULL == abc3) {
      fprintf(stderr, "open file failed.L1\n");
      // memory leaks
      free(abc2);
      free(abc1);
      free(home);
      return -1;
    }

    fscanf(abc3, "%s", abc2);
    fprintf(stdout, "abc2==%s\n", abc2);
    fclose(abc3);

    free(home);
    home = NULL;
    free(abc1);
    abc1 = NULL;
    free(abc2);
    abc2 = NULL;
    return 0;
}

rt3 发表于 2023-1-24 21:28:07

人造人 发表于 2023-1-24 21:22
这程序没有问题吧?是不是缓冲区太小,溢出了?
你是如何判断出是调用fclose报错的?

我自己查错的 时候定义了一个变量,还用了 另一个头文件 每隔一个阶段 递增该变量 并输出该变量值。。
另外 所有数组都是用来保存文件名的。

人造人 发表于 2023-1-24 21:28:17

把指针重置为NULL大可不必
当然这是对我来说的,^_^

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

int main() {
    int rv = 0;
    char *home = malloc(1024);
    strcpy(home, getenv("HOME"));

    char *abc1 = malloc(1024);
    char *abc2 = malloc(1024);

    sprintf(abc1, "%s/goal", home);
    FILE *abc3 = fopen(abc1, "r+");
    if(abc3) {
      fscanf(abc3, "%s", abc2);
      fprintf(stdout, "abc2==%s\n", abc2);
      fclose(abc3);
    } else {
      fprintf(stderr, "open file failed.L1\n");
      rv = -1;
    }

    free(abc2);
    free(abc1);
    free(home);
    return rv;
}

人造人 发表于 2023-1-24 21:29:05

rt3 发表于 2023-1-24 21:28
我自己查错的 时候定义了一个变量,还用了 另一个头文件 每隔一个阶段 递增该变量 并输出该变量值。。

这如何能够说明 是调用fclose报错的?

rt3 发表于 2023-1-24 21:32:46

人造人 发表于 2023-1-24 21:29
这如何能够说明 是调用fclose报错的?

本来 fclose() 的 调用 在 两次输出 变量值d的 中间。但是 fclose() 后 没有输出d 的值 就 直接崩了

人造人 发表于 2023-1-24 21:34:53

rt3 发表于 2023-1-24 21:32
本来 fclose() 的 调用 在 两次输出 变量值d的 中间。但是 fclose() 后 没有输出d 的值 就 直接崩了

什么两次输出?
这个代码在fclose之后就结束了

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

int main(){

    char* home=malloc(sizeof(char)*30);
    strcpy(home,getenv("HOME"));

    char* abc1=malloc(sizeof(char)*30);
    char* abc2=malloc(sizeof(char)*30);

    sprintf(abc1,"%s/goal",home);
    FILE* abc3=fopen(abc1,"r+");
    if(NULL==abc3){
      fprintf(stderr,"open file failed.L1\n");
      return -1;
    }

    fscanf(abc3,"%s",abc2);
    fprintf(stdout,"abc2==%s\n",abc2);
    fclose(abc3);

   free(home);
   home=NULL;
   free(abc1);
   abc1=NULL;
   free(abc2);
   abc2=NULL;
    return 0;
}
   

   

人造人 发表于 2023-1-24 21:35:24

rt3 发表于 2023-1-24 21:32
本来 fclose() 的 调用 在 两次输出 变量值d的 中间。但是 fclose() 后 没有输出d 的值 就 直接崩了

哪来的变量d ?

dolly_yos2 发表于 2023-1-24 21:36:32

只能建议试试调试器/内存错误检查工具/ strace 之类的跟踪工具

rt3 发表于 2023-1-24 21:45:04

人造人 发表于 2023-1-24 21:35
哪来的变量d ?

本来在程序开头定义的。但是在提交上来以前把相关的代码删了,不然代码会非常长
页: [1]
查看完整版本: Linux C语言编程调用fclose()报错