【问题标题】:size of memory allocated by mallocmalloc 分配的内存大小
【发布时间】:2014-01-29 05:04:01
【问题描述】:

我正在为指针分配一个新的内存块,但显然该块的大小不是我作为参数传递给 malloc 的那个大小

char *q="tre";
printf("q in main %zu\n", sizeof(q));
q = (char*)malloc(6);
printf("q in main %zu\n", sizeof(q));

输出

8
8

然而,指针确实指向一个新的内存块。 这怎么可能?

【问题讨论】:

  • 您是否希望每次将char * 指向不同的内存地址时都会改变它的大小?
  • 你得到的是指针的大小。

标签: c pointers malloc sizeof


【解决方案1】:

sizeof 返回指针的大小,在你的情况下是(char*),它不会给出malloc 分配的内存。将内存大小保存在单独的变量中以供以后使用。

【讨论】:

    【解决方案2】:
    char *q;
    printf("%zu\n", sizeof(q));
    

    sizeof(q) 指的是指针的大小,而不是它指向的内存量。

    【讨论】:

    • 内存未“分配给 [指针]”。它只是被分配的,并且指针指向它。
    【解决方案3】:

    您获得的是变量q 作为指针类型的大小。通常,所有指针在您的程序中都将具有相同的大小。

    由于 8 个字节是 64 位,看来您正在执行 64 位应用程序。 :)

    【讨论】:

      【解决方案4】:

      sizeof(q) 返回指针 q 的大小,在 64 位机器上将是 8 个字节,而不是在该指针处分配的内存块的大小。 sizeof 是编译时而不是运行时操作。

      我不清楚你想在这里做什么,但是如果你想为位置s 的字符串分配足够的内存,那么你想malloc(strlen(s)+1)(+1 用于终止NULL)。

      也许你想得到malloc()ed 块的大小。据我所知,没有可移植的方法来做到这一点,但malloc_usable_size 几乎可以在glibc 上做到这一点。从手册页:

      malloc_usable_size() 返回动态分配的缓冲区 ptr 中可用的字节数,它可能大于请求的大小(但如果请求成功,则保证至少一样大)。通常,您应该存储请求的分配大小而不是使用此函数。

      注意最后一句话。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-13
        • 2021-01-26
        • 2011-06-24
        • 2012-12-26
        • 2014-02-20
        • 2015-09-21
        • 2014-12-29
        • 2021-12-12
        相关资源
        最近更新 更多