keo*_*ont 7 c free memory-management realloc
所以这次我真的不知道如何把这个头衔.首先,我想说,如果问题与"家庭作业"有关,我在这个页面上看到了一些关于警告的评论.我的是,但它也已完成,我只是想进一步了解代码发生了什么.
我也读了一段时间的帖子和书籍,但我想我仍然缺少一些东西.
我有两行代码我在我使用的代码中不太了解.这项工作是关于获取用作参数的任何文件(如果它是0文件,它从stdin读取),并在标准输出上向后打印它.所有这些,谈论C,因为我试图放入标签.
第一个问题是:
array = realloc (array, 0);
其中数组定义为
char **array;
问题是免费不起作用,它没有释放使用的空间(也许我用错了?在其他地方我知道如何使用它,但不是这次).通过我已经完成的测试和我读过的内容,我相信realloc也在做同样的事情,但我不是100%.
第二个是:
char* alloc = malloc (strlen ((char*)string)+1);
其中alloc用于复制我要放入数组的行的确切长度,所以我可以在此之后向后打印文本.
问题是为什么我必须使用+1.我的意思是如果由于某种原因我不使用它不起作用,我尝试使用不同的数字,它每次都有效,但如果我不这样做+1它不能正常工作.
我知道可能这个问题太模糊,而且写的很糟糕,但是我又不确定这一点,我也尽力解释自己(英语没有母语,因为它可能很明显).
realloc大小为0时的行为在C11(当前版本)中不同.标准说(C11为7.20.3.1,C1x为7.22.3.1)
如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应用于访问对象
所以,使用free和不依赖realloc.
通过char*始终处理字符串时,请记住为null终止符包含一个额外字符\0.这是显示字符串结束位置的常用方法(另一种是显式字符串长度).
当使用malloc和free记住他们必须完全匹配.你需要free由malloc或返回的确切指针(值)realloc.
数组 = realloc(数组, 0);
在某些 C 实现上,大小为零的 Realloc相当于 free(),但不是全部。
问题是 free 不起作用,它不会释放已使用的空间
考虑一下它的char **array含义以及它在您的应用程序中的分配方式。指向指针的指针通常用作二维数组,表示为数组的数组。大多数应用程序通过多次调用 malloc() 来分配它们。array只是一个 的数组char *,其中该数组的每个元素都是 的数组char。简单地对 的 数组调用 free()char *将释放 的数组char *,但不会释放 的每个数组char。
您需要按照此处所述多次调用 free() 。
我尝试使用不同的数字,每次都有效,但如果我不这样做+1,它就无法正常工作。
C 字符串以null 结尾,这意味着程序通过在字符串末尾放置一个 nul 字符来跟踪字符串的结束位置。这意味着长度为 N 的 C 字符串需要 N 个字符的空间,再加上一个 nul 字符。那么内存空间的总长度就是N+1。
关于第二个问题:
在 C 中,字符串应以空字符“\0”结尾。当您使用 strlen 时,该字符不被计算在内,但您需要为其分配足够的空间(即+1)。
如果您尝试打印不包含空字符的字符串,则可能会打印一些“随机”字符,但也可能会崩溃。如果您使用 strcpy,则会发生缓冲区溢出。