鱼C论坛

 找回密码
 立即注册
查看: 1728|回复: 11

[已解决]Linux C语言编程调用fclose()报错

[复制链接]
发表于 2023-1-24 20:49:59 | 显示全部楼层 |阅读模式
10鱼币
报错信息是
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
本来在程序开头定义的。但是在提交上来以前把相关的代码删了,不然代码会非常长

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

最佳答案

查看完整内容

不知道你那边是什么情况,我只能说应该不是这个代码的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-24 20:50:00 | 显示全部楼层    本楼为最佳答案   
rt3 发表于 2023-1-24 21:45
本来在程序开头定义的。但是在提交上来以前把相关的代码删了,不然代码会非常长

不知道你那边是什么情况,我只能说应该不是这个代码的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


我自己查错的 时候定义了一个变量,还用了 另一个头文件 每隔一个阶段 递增该变量 并输出该变量值。。
另外 所有数组都是用来保存文件名的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

这如何能够说明 是调用fclose报错的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-1-24 21:32:46 | 显示全部楼层
人造人 发表于 2023-1-24 21:29
这如何能够说明 是调用fclose报错的?

本来 fclose() 的 调用 在 两次输出 变量值d的 中间。但是 fclose() 后 没有输出d 的值 就 直接崩了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
    

    
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

哪来的变量d ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-24 21:36:32 From FishC Mobile | 显示全部楼层
只能建议试试调试器/内存错误检查工具/ strace 之类的跟踪工具
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-1-24 21:45:04 | 显示全部楼层

本来在程序开头定义的。但是在提交上来以前把相关的代码删了,不然代码会非常长
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 01:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表