我仍在尝试掌握C的基础知识,现在我只是在尝试处理char指针。
当我尝试释放inputFile
时,我检测到一个glibc,该glibc继续进行,然后向我显示内存映射,然后中止。
为什么会这样?
我提供了使用inputFile
的所有代码
编辑:在新代码中进行了以下更改。仍然会出现相同的错误,并且由于某种原因,它告诉我该文件不存在,即使它已经存在并且之前也可以工作。
char *inputFile = malloc(100 * sizeof(char));
strcpy(inputFile, "NULL"); //NEW CHANGE
.
.
.
if(optind < argc)
{
strcpy(inputFile, argv[argc -1]); //NEW CHANGE
}
else if(optind == argc)
{
printf("Type the name of the input file\n");
fgets(inputFile, 30, stdin);
printf("Your input file name is: %s", inputFile);
}
if(strcmp(inputFile,"NULL") == 0)
{ //NEW CHANGE
printf("No inputfile detected");
exit(1);
}
if(argc != 1)
{
int rows, cols, newRows, newCols;
PIXEL *b, *nb;
readFile(inputFile, &rows, &cols, &b);
writeFile(fname, rows, cols, b);
free(inputFile);
}
这是我得到的确切错误:
example.bmp
Your input file name is: example.bmp
Can't open bmp file to read: No such file or directory
*** glibc detected *** ./bmptool: double free or corruption (out): 0x00007ffc4765c400 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3111275e5e]
/lib64/libc.so.6[0x3111278cf0]
./bmptool[0x401e15]
/lib64/libc.so.6(__libc_start_main+0x100)[0x311121ed20]
./bmptool[0x4009c9]
======= Memory map: ========
00400000-00403000 r-xp 00000000 00:1d 35691265 /a/buffalo.cs.fiu.edu./disk/jccl-001/homes/cmanr012/Programming3/bmptool
00602000-00603000 rw-p 00002000 00:1d 35691265 /a/buffalo.cs.fiu.edu./disk/jccl-001/homes/cmanr012/Programming3/bmptool
00c5c000-00c7d000 rw-p 00000000 00:00 0 [heap]
3110e00000-3110e20000 r-xp 00000000 fc:01 279087 /lib64/ld-2.12.so
3111020000-3111021000 r--p 00020000 fc:01 279087 /lib64/ld-2.12.so
3111021000-3111022000 rw-p 00021000 fc:01 279087 /lib64/ld-2.12.so
3111022000-3111023000 rw-p 00000000 00:00 0
3111200000-311138b000 r-xp 00000000 fc:01 279306 /lib64/libc-2.12.so
311138b000-311158a000 ---p 0018b000 fc:01 279306 /lib64/libc-2.12.so
311158a000-311158e000 r--p 0018a000 fc:01 279306 /lib64/libc-2.12.so
311158e000-3111590000 rw-p 0018e000 fc:01 279306 /lib64/libc-2.12.so
3111590000-3111594000 rw-p 00000000 00:00 0
32f6800000-32f6816000 r-xp 00000000 fc:01 279209 /lib64/libgcc_s-4.4.7-20120601.so.1
32f6816000-32f6a15000 ---p 00016000 fc:01 279209 /lib64/libgcc_s-4.4.7-20120601.so.1
32f6a15000-32f6a16000 rw-p 00015000 fc:01 279209 /lib64/libgcc_s-4.4.7-20120601.so.1
7f3710000000-7f3710021000 rw-p 00000000 00:00 0
7f3710021000-7f3714000000 ---p 00000000 00:00 0
7f37164b6000-7f37164b9000 rw-p 00000000 00:00 0
7f37164d6000-7f37164da000 rw-p 00000000 00:00 0
7ffc4764a000-7ffc4765f000 rw-p 00000000 00:00 0 [stack]
7ffc477ff000-7ffc47800000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)
答案 0 :(得分:1)
这三个引起了重大问题:
char *inputFile = malloc(100 * sizeof(char));
...
inputFile = NULL;
...
inputFile = argv[argc -1];
...
free(inputFile);
第一个分配内存(足够合理)。
然后第二个通过删除指针泄漏内存(不是很合理)。
然后,第三个将程序参数的值分配给char
指针(确定)。
然后第四步继续释放该程序参数(哇!未定义行为时间!)。
您可能打算做的是:
char inputFile[100];
...
inputFile[0] = 0;
...
strcpy(inputFile, argv[argc - 1]);
引用C11草案N1548:
如果参数与内存管理函数先前返回的指针不匹配,或者如果通过调用
free
或realloc
释放了空间,则该行为是不确定的。
编辑:
strcpy(inputFile, "NULL"; //NEW CHANGE
这是完全错误的。首先,NULL
是符号常量,而不是字符串。
if(strcmp(inputFile,"NULL") == 0) { //NEW CHANGE
这绝对也是错误的。它应该是if(!*inputfile)
。同样,NULL
是符号常量。