gpt4 book ai didi

c - 如何释放字符*

转载 作者:行者123 更新时间:2023-11-30 14:37:47 25 4
gpt4 key购买 nike

我仍在尝试掌握 C 的基础知识,现在我只是尝试处理 char 指针。当我尝试释放 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);
}

这就是我收到的确切错误:

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)

最佳答案

这三个因素导致了重大问题:

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:

if the argument does not match a pointer earlier returned by a memory management function, or if the space has been deallocated by a call to free or realloc, the behavior is undefined.

编辑:

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

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

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

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

关于c - 如何释放字符*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57032236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com