如何释放字符*

时间:2019-07-15 00:55:42

标签: c

我仍在尝试掌握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)

1 个答案:

答案 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:

  

如果参数与内存管理函数先前返回的指针不匹配,或者如果通过调用freerealloc释放了空间,则该行为是不确定的。

编辑:

strcpy(inputFile, "NULL"; //NEW CHANGE

这是完全错误的。首先,NULL是符号常量,而不是字符串。

if(strcmp(inputFile,"NULL") == 0) { //NEW CHANGE

这绝对也是错误的。它应该是if(!*inputfile)。同样,NULL是符号常量。