c - 大小信息如何通过指针传递?

标签 c pointers memory-management

我正在学习 C 并使用 free() 函数让我想到了这个问题。假设我有一个指针:

char *p = "String";

现在已经分配了 7 个字节的内存供 p 指向。然而,sizeof(*p) 返回 1,这使得指针看起来只“知道”它所保存的地址的 1 个字节。

如果是这种情况,那么 free(p) 如何释放所有 7 个字节。所以我唯一能想到的是:

  1. 幕后正在发生一些事情

  2. 只有指向的第一个字节需要释放

是其中之一吗?如果是 1.隐藏的进程是什么/它是如何工作的?如果是 2,那么机器如何跟踪不应该分配给其他指针和变量的其他 6 个字节?

感谢您的帮助!

最佳答案

sizeof(*p) 为 1,因为 p 指向一个字符(一个字节)。

“它如何知道”分配的内存有多大 - 它是“平台相关的”。很多时候你会发现关于 malloc 的两件事:

  • 它分配的 block 比您要求的更大 - 因为它更多 一次可以高效地处理 64 个字节(对齐问题等)
  • 通常,指针“正下方”有一个小代码块,其中包含有关 block 大小的一些信息,以及指向“下一个和上一个 block ”的指针 - 就像链接列表一样。这样,如果您清除一个 block ,内存管理就可以跟踪哪些是空闲的,哪些不是。
  • 也可能单独维护一个分配表,用于描述哪些 block 是空闲/已使用的、它们有多大等。

注意 - 我上面描述的内容与使用 malloc 分配内存有关 - 这是 C 可以 free() 的唯一类型。字符串常量以不同的方式分配,并且它的大小和位置是固定的 - 这就是为什么你通常会写

const char *p = "hello";

对于这样的字符串,您可以通过查找 nul 终止符来了解其大小。但是,如果您实际上决定用 '\0' 覆盖字符串中前面的字符,则它不会更改分配的内存量:

char p[] = "hi there world";
p[2] = '\0';
printf("%s***\n", p);

输出:

hi***

但是内存没有被释放。

关于c - 大小信息如何通过指针传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20508780/

相关文章:

c++ - 指针和内存泄漏

C - 向函数传递一个指向函数指针的指针

c - 发生错误时如何释放先前分配的内存?

linux - 谁负责释放图像的 .bss 部分中保留的内存?

c - 如何在 c 中创建我自己的 sleep 或延迟函数

c - 处理帕斯卡三角形的数字溢出

c - 使用函数指针创建菜单驱动系统

c++ - 是否需要 "nested"释放 std::vector<pair<vector<int>,int>> 中的保留内存以手动释放它?

C 压痕工具

c - BLOB,它是如何工作的