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;
}
谢谢 rt3 发表于 2023-1-24 21:45
本来在程序开头定义的。但是在提交上来以前把相关的代码删了,不然代码会非常长
不知道你那边是什么情况,我只能说应该不是这个代码的问题
这程序没有问题吧?是不是缓冲区太小,溢出了?
你是如何判断出是调用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$
另外,请记住 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;
}
人造人 发表于 2023-1-24 21:22
这程序没有问题吧?是不是缓冲区太小,溢出了?
你是如何判断出是调用fclose报错的?
我自己查错的 时候定义了一个变量,还用了 另一个头文件 每隔一个阶段 递增该变量 并输出该变量值。。
另外 所有数组都是用来保存文件名的。 把指针重置为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;
}
rt3 发表于 2023-1-24 21:28
我自己查错的 时候定义了一个变量,还用了 另一个头文件 每隔一个阶段 递增该变量 并输出该变量值。。
这如何能够说明 是调用fclose报错的? 人造人 发表于 2023-1-24 21:29
这如何能够说明 是调用fclose报错的?
本来 fclose() 的 调用 在 两次输出 变量值d的 中间。但是 fclose() 后 没有输出d 的值 就 直接崩了 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;
}
rt3 发表于 2023-1-24 21:32
本来 fclose() 的 调用 在 两次输出 变量值d的 中间。但是 fclose() 后 没有输出d 的值 就 直接崩了
哪来的变量d ? 只能建议试试调试器/内存错误检查工具/ strace 之类的跟踪工具 人造人 发表于 2023-1-24 21:35
哪来的变量d ?
本来在程序开头定义的。但是在提交上来以前把相关的代码删了,不然代码会非常长
页:
[1]