之前在腾讯实习生笔试的时候,遇到一个问题,当时一点思路也没有,现在想了想,找了一些资料,大体上明白了应该如何去做。
问题是:
使用C实现求一个变量的大小,不使用sizeof。
首先我先把我的代码贴上:
#define size(x) ((char*)(&x+1)-(char*)(&x))
该宏定义就实现了刚刚的需求。
首先,我们知道,char是占用一个字节的大小,我们得到一个变量之后,先取其引用,即&x,则该引用指向变量x的首地址。
而&x+1,是跨越该x之后的第一个地址。
我们举个例子:
我们有一个数组:
int a[] = {10,20,30,40,50};
我们先看a的内存分布:
a也是指向数组第一个元素首地址的,也就是指向元素10所在的位置,则(*a)代表着就是值10,那么(*a+1)就相当于10+1=11;(a+1)指向的是下一个元素的位置,则(*(a+1))代表着就是20。
而&a指向的整个数组的首地址,虽然说整个数组的首地址就是第一个元素的首地址,但是整体感觉来说还是不一样的,这样来看,(*a+1)是数组中的第一个元素值加一,而(&a+1)是整个数组加一,下面这个图很好的诠释了这个问题。
所以说,我们想要求得一个变量的大小的话,只要使(&a+1)减去(&a),然后再转化成字节的形式就可以了。
而char类型正好占用一个字节的形式,所以将其强制转化为char*类型就可以求出其大小了。
2:在上面指针的分析当中,(a+1)是指向下一个元素的首地址,那么我们还有一种思路就是这样的,将变量放入到一个数组当中,将(a+1)减去a就得到了变量的大小,再强制转化为字节形式就可以了。
下面是我的实现:
#include <stdio.h>
struct hello{
char c1;
int m;
char c2;
};
int main(void)
{
struct hello a;
struct hello b[] = {a,a,a};
int s = (char*)(b+1) - (char*)b;
printf("%d\n",s);
return 0;
}
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
在Eclipse下,使用SizeOf.jar工具监测变量占用内存大小
程序通过简洁的代码展示了如何使用sizeof来查找各种变量类型的大小,这是C语言编程中重要的一环,非常适合初学者进行学习。 程序的主要目标是确定各种类型的变量在内存中的大小。 程序的开头,我们包含了stdio.h...
指针均可看为变量类型的一种。所有指针变量的sizeof 操作结果均为4。 注意:int *p; sizeof(p)=4; 但sizeof(*p)相当于sizeof(int); 对于静态数组,sizeof可直接计算数组大小; 例:int a[10];char b[]="hello";...
操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 (二)使用方法 1、用于数据类型 sizeof使用形式:sizeof(type) ,如sizeof(int) 2、用于变量 sizeof使用形式:...
操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型 sizeof使用形式:sizeof(type) 数据类型必须用括号括住。如sizeof...
这个程序在运行时会显示四种基本数据类型(int, double, float, char)在系统内存中的大小(以字节为单位)。这些值会因系统和编译器的不同而有所不同。
5)sizeof 引用得到的是所指向的变量(对象)的大小,而sizeof 指针得到的是指针本身的大小。 6)引用访问一个变量是直接访问,而指针访问一个变量是间接访问。 7)使用指针前最好做类型检查,防止野指针的出现; 8)...
C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么。我以前也有用错的时候,现在写一写,也算是提醒一下自己吧。 sizeof是什么 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–...
在不同编译器上变量字节的大小,32位,64位, 常用数据类型对应字节数 可用如sizeof(char),sizeof(char*)等得出
在C++中使用sizeof要比C复杂很多,因为C++类中有static静态变量,virtual虚函数,还有继承、派生等。sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。它并不是函数。sizeof操作符以字节形式给出了其...
sizeof作用于基本数据类型,在特定的平台和特定的编译器中,结果是确定的,如果使用sizeof计算构造类型:结构体、联合体和类的大小时,情况稍微复杂一些。 1.sizeof计算结构体 考察如下代码: struct S1 { char c; ...
sizeof其实就是用于告诉我们编译器在为某一特定数据或者某种数据类型的数据在存储空间中开辟空间时,开辟的空间大小,以字节为单位。 3,怎么用? sizeof(类型),或者sizeof(变量)都可以,得到的就是类型或者变量...
在C语言中存在关于结构体的存储空间大小是比较深入的话题,其中涉及计算机的基本原理、操作系统等。我认为对齐是C语言中让很多初学者都拿不准摸不透的问题,特别是在跨平台的情况下,对齐这种问题更加的复杂多变,每...
1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? virtual修饰符会被隐形继承的。 private 也被集成,只事派生类没有访问权限而已 virtual可加可不加 子类的空间里有父类...
1、编译时计算运算符sizeof,可用类型或变量做参数,计算占用内存的大小。sizeof后若是类型必须加括弧,若是变量名可不加括弧。sizeof(x)可用来定义数组维数如: 代码如下: printf(“%d\n”, sizeof(short)); ...
其实,这是VC对变量存储的一个特殊处理。为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的...
sizeof() : 参数是数据类型, 基础数据类型和结构体, 以及变量名均可, 返回值是传入参数在内存中占用字节的大小 示例: int* p = (int*)malloc(sizeof(int)); 此时p为指向内存大小为一个int类型的指针
结构变量成员的表示方法在程序中使用结构变量时, 往往不把它作为一个整体来使用。 在ANSI C中除了允许具有相同类型的结构变量相互赋值以外, 一般对结构变量的使用,包括赋值、输入、输出、 运算等都是通过结构...
从功能定义上,strlen函数,用来求字符串的长度,sizeof函数是用来求指定变量或变量类型等所占用内存的 大小; 2.sizeof是运算符,而strlen是C库函数strlen只能用char*做参数,且以'\0'结尾的; 对于静态数组处理: ...
什么是同步呢?当两个或多个线程需要访问同一资源时,...(4)sizeof(一大堆变量),如果用这个函数分配内存的大小一定与定义相同吗? 答曰:想不相同不清楚,但是肯定的是指回答不会小,因为使用sizeof分配内存不会错