c - 解释 malloc、free 和对象大小

标签 c

我尝试通过调用 mallac 将新内存分配给指针然后释放它来测试 mallocfree ,但 sizeof 返回的值根本没有改变。我认为当声明一个指针时,它会获得一些内存,这些内存由 sizeof 返回的值表示;当我调用malloc时,它的大小应该根据参数的值改变;最后当我调用 free 时,它​​的大小是 0。我敢打赌我的想法是不正确的。有人能帮我吗?

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>


int main(int argc, char **argv)
{

    char *p;

    printf("size of p : %d\n", sizeof(p));

    p = malloc(256);

    printf("size of p : %d\n", sizeof(p));

    free(p);

    printf("size of p : %d\n", sizeof(p));

    printf("Allocate new storage\n");
    p = (char *)malloc(1);

    printf("size of p : %d\n", sizeof(p));

    return 0;

}

最佳答案

此类信息由操作系统内存管理器处理。 sizeof(p) 将为您提供实际指针的大小,sizeof(*p) 将为您提供它所指向的对象的大小,但不是实际大小动态分配。

通常,分配的内存在实际数据之前有一个小 header ,其中包含操作系统能够正确取消分配内存所需的信息,尽管它完全是实现定义的。这就是为什么您只需要指定要分配多少内存,但 free() 不需要它,内存管理负责处理它。通常您不会有任何访问权限,也不需要任何访问权限。

关于c - 解释 malloc、free 和对象大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29113431/

相关文章:

c++ - 欺骗 ARM 连接器将功能代码放入某些数据存储器中

c++ - 显示 ld 通过 -l 找到的库的路径

c - 字符串转换为数字 ( strtod ) 的问题

c - 将一个元素重新添加到动态数组列表中(从内存中删除后)

c - Ping 服务器并检查 C 程序的结果?

c - 使用 C 使用 malloc 和 realloc 进行动态分配

c - 更新 C 函数内的字符串数组

c - 为什么这段c代码没有改变arr[3]的值?

C : Set timeout for blocking system calls

c++ - 数组指针算术 - 合法和未定义的行为