C 如何释放字符*
我仍在努力掌握C语言的基本知识,现在我只想处理字符指针。 当我尝试释放C 如何释放字符*,c,C,我仍在努力掌握C语言的基本知识,现在我只想处理字符指针。 当我尝试释放inputFile时,我检测到一个glibc,它继续向我显示内存映射,然后中止。 为什么呢 我提供了使用inputFile的所有代码 编辑:在新代码中进行了以下更改。仍然会出现相同的错误,并且由于某种原因,它告诉我该文件不存在,即使它在那里并且以前工作过 char *inputFile = malloc(100 * sizeof(char)); strcpy(inputFile, "NULL"); //NEW CHANGE
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);
- 第一个分配内存(足够合理)
- 然后第二个通过移除指针(不太合理)泄漏内存
- 然后第三个将程序参数的值赋给
指针(ok)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
这肯定也是错误的。如果(!*inputfile),则应为
。同样,NULL
是一个符号常量。inputFile=malloc(…)
后跟inputFile=NULL
将使您丢失刚才分配的内存。这相当于执行,例如,inta=5;a=10然后想知道为什么a
不再等于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