我正在学习 C 并使用 free() 函数让我想到了这个问题。假设我有一个指针:
char *p = "String";
现在已经分配了 7 个字节的内存供 p 指向。然而,sizeof(*p) 返回 1,这使得指针看起来只“知道”它所保存的地址的 1 个字节。
如果是这种情况,那么 free(p) 如何释放所有 7 个字节。所以我唯一能想到的是:
幕后正在发生一些事情
只有指向的第一个字节需要释放
是其中之一吗?如果是 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/