请考虑以下代码:
printf
当我使用一些printf("str[0] = '%p'\nstr[1] = '%p'\nstr[2] = '%p'\n", str[0], str[1], str[2]);
来打印每个指针的内存地址时:
str[0] = '0x1254030'
str[1] = '0x1254050'
str[2] = '0x1254080'
我得到了这个输出:
str[0]
我期望第二个地址对应的数字是第一个地址对应的数字和24之间的数字之和,它对应于字符串0x1254047
的大小(以字符为单位) 1个字节)。考虑到这个数字用16(0123456789abcdef)表示,我预计第二个地址对应的数字为def buckets = ctx.payload.aggregations.metrics.buckets.sort((a,b) -> a.largest_surprise.value == b.largest_surprise.value ? 0 : a.largest_surprise.value < b.largest_surprise.value ? -1 : 1);
。
在我看来,我发现了一个模式:从一个字符串中的24个字符开始,对于其中包含的每16个字符,使用的内存大16个字节。例如,45个字符长的字符串使用64个字节的内存,77个字符长的字符串使用80个字节的内存,150个字符长的字符串使用160个字节的内存。
以下是模式的说明:
我想了解为什么分配的内存不等于字符串的大小。为什么会遵循这种模式?
答案 0 :(得分:4)
至少有两个原因malloc()
可能会以您注意到的方式返回记忆。
aligned_alloc
,calloc
,
malloc
,和
realloc
函数未指定。 的
如果分配成功,则返回指针,以便可以将其分配给
指向具有基本对齐要求的任何类型对象的指针 ...“注意斜体部分。由于malloc()
实现不知道要使用的内存,返回的内存有适合任何可能使用。这通常意味着8或16字节对齐,具体取决于平台。答案 1 :(得分:3)
三个原因:
(1)字符串“ABC”包含4个字符,因为C中的每个字符串都必须有一个终止'\ 0'。
(2)许多处理器都有内存地址对齐问题,当malloc()分配的任何块在4或8的倍数或任何“自然”内存大小的地址上启动时,它会最有效。
(3)malloc()函数本身需要一些内存来存储有关已分配内容的信息,以便free()知道该怎么做。