鱼C论坛

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

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

[复制链接]
发表于 2023-1-24 20:49:59 | 显示全部楼层 |阅读模式
10鱼币
报错信息是
munmap_chunk(): invalid pointer


  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. int main(){

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

  7.     char* abc1=malloc(sizeof(char)*30);
  8.     char* abc2=malloc(sizeof(char)*30);

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

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

  18.    free(home);
  19.    home=NULL;
  20.    free(abc1);
  21.    abc1=NULL;
  22.    free(abc2);
  23.    abc2=NULL;
  24.     return 0;
  25. }
  26.    

  27.    
复制代码


谢谢
最佳答案
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报错的?

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

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

  8.     char *abc1 = malloc(sizeof(char) * 1024);
  9.     char *abc2 = malloc(sizeof(char) * 1024);

  10.     sprintf(abc1, "%s/goal", home);
  11.     FILE *abc3 = fopen(abc1, "r+");
  12.     if(NULL == abc3) {
  13.         fprintf(stderr, "open file failed.L1\n");
  14.         // memory leaks
  15.         free(abc2);
  16.         free(abc1);
  17.         free(home);
  18.         return -1;
  19.     }

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

  23.     free(home);
  24.     home = NULL;
  25.     free(abc1);
  26.     abc1 = NULL;
  27.     free(abc2);
  28.     abc2 = NULL;
  29.     return 0;
  30. }
  31. sh-5.1$ ./main
  32. abc2==hello
  33. sh-5.1$
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2023-1-24 21:23:24 | 显示全部楼层
另外,请记住 sizeof(char) == 1

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

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

  7.     char *abc1 = malloc(1024);
  8.     char *abc2 = malloc(1024);

  9.     sprintf(abc1, "%s/goal", home);
  10.     FILE *abc3 = fopen(abc1, "r+");
  11.     if(NULL == abc3) {
  12.         fprintf(stderr, "open file failed.L1\n");
  13.         // memory leaks
  14.         free(abc2);
  15.         free(abc1);
  16.         free(home);
  17.         return -1;
  18.     }

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

  22.     free(home);
  23.     home = NULL;
  24.     free(abc1);
  25.     abc1 = NULL;
  26.     free(abc2);
  27.     abc2 = NULL;
  28.     return 0;
  29. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2023-1-24 21:28:07 | 显示全部楼层
人造人 发表于 2023-1-24 21:22
这程序没有问题吧?是不是缓冲区太小,溢出了?
你是如何判断出  是调用fclose报错的?


我自己查错的 时候定义了一个变量,还用了 另一个头文件 每隔一个阶段 递增该变量 并输出该变量值。。
另外 所有数组都是用来保存文件名的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2023-1-24 21:28:17 | 显示全部楼层
把指针重置为NULL大可不必
当然这是对我来说的,^_^

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. int main() {
  5.     int rv = 0;
  6.     char *home = malloc(1024);
  7.     strcpy(home, getenv("HOME"));

  8.     char *abc1 = malloc(1024);
  9.     char *abc2 = malloc(1024);

  10.     sprintf(abc1, "%s/goal", home);
  11.     FILE *abc3 = fopen(abc1, "r+");
  12.     if(abc3) {
  13.         fscanf(abc3, "%s", abc2);
  14.         fprintf(stdout, "abc2==%s\n", abc2);
  15.         fclose(abc3);
  16.     } else {
  17.         fprintf(stderr, "open file failed.L1\n");
  18.         rv = -1;
  19.     }

  20.     free(abc2);
  21.     free(abc1);
  22.     free(home);
  23.     return rv;
  24. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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之后就结束了

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. int main(){

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

  7.     char* abc1=malloc(sizeof(char)*30);
  8.     char* abc2=malloc(sizeof(char)*30);

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

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

  18.    free(home);
  19.    home=NULL;
  20.    free(abc1);
  21.    abc1=NULL;
  22.    free(abc2);
  23.    abc2=NULL;
  24.     return 0;
  25. }
  26.    

  27.    
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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

GMT+8, 2023-2-9 11:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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