【问题标题】:In C, is there a way to calculate the size of allocated memory filled with null-terminators? [closed]在 C 中,有没有办法计算填充了空终止符的分配内存的大小? [关闭]
【发布时间】:2021-01-16 21:14:51
【问题描述】:

我需要像strlen 这样的东西,但字符串只填充了空终止符"\0\0\0\0\0\0\0",我需要用另一个字符填充它,直到(不包括)最后一个\0,就像"FFFFFF\0"。有没有办法计算出大小而不会出错?

我必须为一个名为“libft”的学校项目实施bzero。然后我的任务是实现strcpy,我在手册页中看到dest 需要足够大才能接收src 的副本,所以我想说明bzero 在@987654330 上使用的情况@ 和 strcpy 不允许我将 dest 的大小作为参数传递。我只是想知道(出于好奇)我怎么知道dest 有多大,因为我知道strcpy 不能说明这一点。手册页中有一条警告“小心缓冲区溢出!(请参阅 BUGS。)”。

我现在意识到这在 C 中可能是不可能的。

【问题讨论】:

  • 必须以某种方式分配该内存区域。如果你有一个用 nuls 填充的“字符串”,它就不再是一个字符串了。
  • @dawg 是的,我知道它不再是一个字符串,这就是我双引号的原因。如果不只是分配的内存,我不知道它叫什么。
  • 跟踪该区域是如何分配的,并且有你的答案。如果你不知道分配了什么,那就是没有分配,那将是一个问题。

标签: arrays c string strlen


【解决方案1】:

您要问的是您是否可以知道已分配了多少内存。

如果分配给malloc,则没有。

如果它是在堆栈上分配的数组,例如char foo[10],是的,您可以使用sizeof(foo),但这并不能告诉您任何您不知道的事情。

如果您需要知道分配的字符串大小,您需要在分配时记住它并传递它。你可以使用一个额外的变量,或者你可以创建一个struct,它同时具有字符串和大小。

【讨论】:

  • 这不是一个好主意,而是malloc 跟踪大小,所以如果你想编写绝对不可移植的代码,每次切换库时都可能中断,你可以进入malloc 内部。对于 glibc malloc 对于大块大小存储在内存中返回 ptr 之前的 8 个字节中。
  • @Noah 对于 glibc 没有必要 - 有 malloc_usable_size
  • 至少对于 glibc malloc 来说这应该是答案
  • @Noah 这是很好的信息,但我不熟悉编译器特定的功能。写出来作为自己的答案。
  • @Noah 我以前用过这个技巧。但是,它给出了 usable 大小(和 not 特定分配大小)。即:malloc(9)malloc(10)both 产生:16 | ptr 因为隐藏大小是“向上”对齐的“用于任何用途”(即8sizeof(double)、@987654334 @, ETC。)。因此,从 16 开始,无法推断调用是 9 还是 10。此外,堆例程可以使对齐 anything(例如 64)。而且,对齐量可以在“每个竞技场”的基础上完成。
【解决方案2】:

不,没有通用的方法。如果您的char * input 满足*input == '\0',那么它是一个大小为零的空终止字符串,我们无法知道input[n] 是否对任何 n > 0 有效。

但是,如果您可以控制input 的分配或任何其他提示,您可以使用那个信息,例如

input = malloc(N);
/* use N */

否则,它是完全不透明的。

【讨论】:

    猜你喜欢
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    相关资源
    最近更新 更多