C 如何释放字符*

C 如何释放字符*,c,C,我仍在努力掌握C语言的基本知识,现在我只想处理字符指针。 当我尝试释放inputFile时,我检测到一个glibc,它继续向我显示内存映射,然后中止。 为什么呢 我提供了使用inputFile的所有代码 编辑:在新代码中进行了以下更改。仍然会出现相同的错误,并且由于某种原因,它告诉我该文件不存在,即使它在那里并且以前工作过 char *inputFile = malloc(100 * sizeof(char)); strcpy(inputFile, "NULL"); //NEW CHANGE

我仍在努力掌握C语言的基本知识,现在我只想处理字符指针。 当我尝试释放
inputFile
时,我检测到一个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);
}

这三个问题造成了重大问题:

char *inputFile =  malloc(100 * sizeof(char));
...
inputFile = NULL;
...
inputFile = argv[argc -1];
...
free(inputFile);
  • 第一个分配内存(足够合理)

  • 然后第二个通过移除指针(不太合理)泄漏内存

  • 然后第三个将程序参数的值赋给
    char
    指针(ok)

  • 然后第四个继续释放程序参数(哇!未定义的行为时间!)

您可能打算做的是:

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

这肯定也是错误的。如果(!*inputfile),则应为
。同样,
NULL
是一个符号常量。

inputFile=malloc(…)
后跟
inputFile=NULL
将使您丢失刚才分配的内存。这相当于执行,例如,
inta=5;a=10a
不再等于
5
。我想你真正想要的是创建一个空字符串,你可以使用
inputFile[0]='\0'
来实现。然后应该使用strcpy(inputFile,argv[argc-1])
来复制字符串。并使用
strlen(inputFile)
检查其长度。执行
inputFile=argv[argc-1]
操作时,您将再次丢失分配的内存。做
fgets(inputFile…
将引发异常,因为
inputFile
没有指向有效的内存。此外,您确实应该阅读相关内容,因为它写入
inputFile
的字符串不太可能是有效的文件名。这是一个完全的XY问题。正确的解决方案甚至不需要mallocI知道它不是字符串,i j我们这样做是为了比较,以防输入文件名从未更改为正确的名称。不过,我不怀疑您的方式更好。不过,我现在看到strcmp行没有用,因为它不会激活,因为我要求在它前面输入它的名称。@CrisManrique在任何情况下,您都应该选择一个无效的文件名(例如
)表示某些内容没有更改。当输入文件名为
NULL
时,它会工作得更好,不会让人生气。明白了,您有什么提示可以解释为什么我仍然会出现错误吗?您不应该对问题中包含的代码获得双重免费。也不需要动态分配和随后的免费。只需使用数组(在编译时会发现诸如重新分配之类的问题)。
if(strcmp(inputFile,"NULL") == 0) { //NEW CHANGE