“长:我的系统是16byte?

时间:2012-03-25 23:35:13

标签: c

#include <stdio.h>

int main(int argc, char *argv[]) {
    long* fp;
    while(1)
    {
        fp = (long* ) malloc (sizeof(long));
        printf("%d\t",fp);
    }
}
我跑了这个。 我得到的结果如下:

1193392 1193408 1193424 1193440 1193456 1193472 1193488 1193504 1193520 1193536 1193552 1193568 1193584 1193600 1193616 1193632 1193648 1193664 1193680 1193696 1193712 1193728 1193744 1193760 1193776 1193792 1193808 1193824 1193840 1193856 1193872 1193888 1193904 1193920 1193936 1193952 1193968 1193984 1194000 1194016 1194032 1194048 1194064 1194080 1194096 

这是否意味着我的系统长16字节?

感谢。

我刚刚注意到......从一开始。差异是14,然后它到了奇怪的16。

6 个答案:

答案 0 :(得分:4)

不一定。它可能表明分配器的粒度是16个字节。

答案 1 :(得分:4)

不,它没有。它只是意味着malloc()返回16字节对齐的块。

此外,您不应使用%d打印指针,应使用%p打印指针。

要了解long的大小,

printf("%zu\n",sizeof(long));

答案 2 :(得分:3)

sizeof(long)具体报道了什么?如果它是16个字节,我会感到惊讶。

来自malloc(3)的注释:

RETURN VALUE
   For calloc() and malloc(), return a pointer to the allocated
   memory, which is suitably aligned for any kind of variable.

您的平台显然需要对某些对象进行16字节对齐,因此这是malloc(3)返回的粒度。

答案 3 :(得分:2)

首先,你正在调用printf; %d调用int类型的参数,并传递其他内容(如long *)来调用未定义的行为。换句话说,你无法从中得出任何真实的结论。

取而代之的是:

printf("%p\n", (void*)fp);

甚至可以直接询问你想要的东西:

printf("%d\n", (int)sizeof(long));

另请注意,大多数系统对malloc的额外开销超出了请求对象的大小。在Linux glibc上,每个malloc必须分配最少2*sizeof(void*)字节,加上超出请求的额外2*sizeof(void*)字节(这是当前的实现;但是这是没有记录的,如有更改,恕不另行通知)。如果您的void*长度为4个字节,则可以很好地与您的观察结果相匹配。

答案 4 :(得分:0)

试试这段代码:

int main(int argc, char *argv[]) {
    printf("%ld", sizeof(long));
}

答案 5 :(得分:0)

没有。相反,标准需要malloc()来返回适合任何数据类型的地址,因此您只是观察平台上的最大对齐为16。