使用realloc(X,0)代替free()并使用长度为+1的malloc +1

keo*_*ont 7 c free memory-management realloc

所以这次我真的不知道如何把这个头衔.首先,我想说,如果问题与"家庭作业"有关,我在这个页面上看到了一些关于警告的评论.我的是,但它也已完成,我只是想进一步了解代码发生了什么.

我也读了一段时间的帖子和书籍,但我想我仍然缺少一些东西.

我有两行代码我在我使用的代码中不太了解.这项工作是关于获取用作参数的任何文件(如果它是0文件,它从stdin读取),并在标准输出上向后打印它.所有这些,谈论C,因为我试图放入标签.

第一个问题是:

array = realloc (array, 0);
Run Code Online (Sandbox Code Playgroud)

其中数组定义为

char **array;
Run Code Online (Sandbox Code Playgroud)

问题是免费不起作用,它没有释放使用的空间(也许我用错了?在其他地方我知道如何使用它,但不是这次).通过我已经完成的测试和我读过的内容,我相信realloc也在做同样的事情,但我不是100%.

第二个是:

char* alloc = malloc (strlen ((char*)string)+1);
Run Code Online (Sandbox Code Playgroud)

其中alloc用于复制我要放入数组的行的确切长度,所以我可以在此之后向后打印文本.

问题是为什么我必须使用+1.我的意思是如果由于某种原因我不使用它不起作用,我尝试使用不同的数字,它每次都有效,但如果我不这样做+1它不能正常工作.

我知道可能这个问题太模糊,而且写的很糟糕,但是我又不确定这一点,我也尽力解释自己(英语没有母语,因为它可能很明显).

And*_*rei 7

realloc大小为0时的行为在C11(当前版本)中不同.标准说(C11为7.20.3.1,C1x为7.22.3.1)

如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应用于访问对象

所以,使用free和不依赖realloc.

通过char*始终处理字符串时,请记住为null终止符包含一个额外字符\0.这是显示字符串结束位置的常用方法(另一种是显式字符串长度).

当使用mallocfree记住他们必须完全匹配.你需要freemalloc或返回的确切指针(值)realloc.


Mar*_*ker 5

数组 = 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。

  • `realloc(p,0)` 与 C11 中的 `free(p)` 不等价 (2认同)
  • `realloc(p,0)` 等价于 Linux 上的 `free(p)`,而不是标准 C 或 [POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/functions/realloc.html )。 (2认同)

Max*_*amy 0

关于第二个问题:

在 C 中,字符串应以空字符“\0”结尾。当您使用 strlen 时,该字符不被计算在内,但您需要为其分配足够的空间(即+1)。

如果您尝试打印不包含空字符的字符串,则可能会打印一些“随机”字符,但也可能会崩溃。如果您使用 strcpy,则会发生缓冲区溢出。