嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2016-03-08 1375 次浏览 标签 : C

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

获取一般数组所占内存大小

int main(int argc, char const *argv[])
{

	int a[]={2,3,4};

	printf("%d\n", sizeof(a));// 12

	return 0;
}
typedef struct _tsrm_tls_entry {
    void **storage;
    int count;
} tsrm_tls_entry;


int main(int argc, char const *argv[])
{
	tsrm_tls_entry *tte = NULL;

	tte = malloc(sizeof(tsrm_tls_entry));

	tte->storage = malloc(sizeof(void *)*3);

	printf("%d\n", sizeof(tte->storage));// 8  这里返回该数组的首地址的大小

	return 0;
}

没有办法获取到这个数组总得内存大小咯?只能在结构体中配备一个成员来专门做计数器?

似乎就是这样,因为没有多余的内存来记录终点指针地址或者数量,所以需要我们自己记录数组的数量了。

但是为什么上面的int a[]却能统计到呢?

区别之一就是下面的结构体中的数组个数是未知的,而int a[]的个数是确定的。

不过int a[]仅占了12字节,没有多余的地址来存放数量(3)啊? 

====好友的解答====

sizeof 会尽可能的确定编译的时候能确定的内存大小,sizeof 的返回值,只要编译的时候能够确定的,sizeof 就可以求得。 

其实内部实现的时候 malloc 申请的空间是一个结构体

struct  xxx {  unsign int size; void * buffer }

malloc  返回值,就是后面的那个 buffer


嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表