不使用sizeof求一个变量的大小

之前在腾讯实习生笔试的时候,遇到一个问题,当时一点思路也没有,现在想了想,找了一些资料,大体上明白了应该如何去做。

问题是:

使用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)
{
    //我们需要求结构a的大小
    struct  hello a;

    //则将三个结构a放到数组中
    struct hello b[] = {a,a,a};

    //按照上面的思想进行求取
    int s = (char*)(b+1) - (char*)b;
    //输出结果没有问题
    printf("%d\n",s);

    return 0;
}
时间: 2024-11-03 05:29:00

不使用sizeof求一个变量的大小的相关文章

递归求一个文件夹大小(二)

public class Test1 { public static void main(String[] args) { // 统计文件夹大小 long len = getDirLength(new File("D:\\JavaSE")); System.out.println(len + "字节"); } // 返回值long类型,参数列表:File dir public static long getDirLength(File dir) { // 定义统计变

sizeof求类的大小

用sizeof求类的大小,http://blog.csdn.net/szchtx/article/details/1025400,这篇博文给出了非常详尽的举例介绍. 但是细心的我还是发现了一个小瑕疵,那就是对如下例子求sizeof(B),在VS下是16不是12! class A { public: int a; private: char b; }; class B : public A { public: int d; char c; }; 以下是我根据上机实验结果,总结的精华要点,希望从此以

sizeof求字节以及与strlen的区别

例子一: /* *根据以下条件进行计算: *1. 结构体的大小等于结构体内最大成员大小的整数倍 *2. 结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍,比如说double型成员相对于结构体的首地址的地址 *偏移量应该是8的倍数. */ #include<iostream> #include<cstdlib> using namespace std; class AA { int a; short b; int c; char d; }; class BB {

C/C++ sizeof函数解析——解决sizeof求结构体大小的问题

C/C++中不同数据类型所占用的内存大小 32位                 64位 char               1                    1 int                  4             大多数4,少数8 short              2                    2 long               4                    8 float               4              

sizeof()计算结构体的大小

简要说明:结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并不是简单的把所有成员大小相加,而是遵循一定的规则,需要考虑到系统在存储结构体变量时的地址对齐问题. 一.没有成员的结构体占用的空间是多少个字节? 答案是:1个字节. 这就是实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类或空结构体(C++中结构体也可看为类)隐含的加一个字节,这样空类或空结构体在实例化后在内存得到了独一无二的地址,所以空类所占的内存

算法题:求一个序列S中所有包含T的子序列(distinct sub sequence)

题: 给定一个序列S以及它的一个子序列T,求S的所有包含T的子序列.例: S = [1, 2, 3, 2, 4] T = [1, 2, 4] 则S的所有包含T的子序列为: [1, 2, 3, 2, 4] [1, 2, 3, 4] [1, 2, 2, 4] [1, 2, 4] 解: 首先可以拆解为两个问题: 1. 求S的所有子序列:其中又涉及到去重的问题. 2. 求S的所有子序列中包含T的子序列. 暂时先不考虑去重,看看问题1怎么解: 一.求S的子序列 单纯求一个序列的所有子序列的话,就是求序列的

求一个数组当中最大(最小)值的两种计算方法

求一个数组当中最大(最小)值的两种计算方法 1.常用方法(以求最大值为例) 1 #include "stdafx.h" 2 #include <string> 3 using namespace std; 4 int _tmain(int argc, _TCHAR* argv[]) 5 { 6 int a[5] = { 1, 23, 2, 6, 7 }; 7 int array_length = sizeof(a) / sizeof(a[0]);//数组大小 8 int m

求一个二叉树中距离最远的两个节点

/*求二叉树中距离最远的两个点 * 基本思路: * 递归计算两棵树的最大高度,设置一个全局变量,距离最远的两个节点element * 其中:在计算左子支,直接刷新上述全局变量,在计算右边子支时,设置两个临时Node变量,变量里的element用于 * 保存右边子支的两个最远距离.根据比较两个距离的大小.其父节点所在的树三个的大小,来重新刷新全局变量. * 一个Trick~:在计算子支的最远距离的时候,因为要和其父节点所在的树比较大小,保存子支的最大距离的点数. */ public class M

《团队开发一(求一个数组的连续的子数组之和的最大值)》

(1)设计思想:一般的,求一个数组的最大子数组之和即是按数组顺序依次让前几个数的和与下一个数进行比较,设一变量来装每次比较后的较大的数,依此进行到数组终端:但是考虑到求的是连续的子数组,则应该想到除了在按顺序上的连续外,还得考虑到末端与首端的连续,所以按数组顺序依次求解得到的未必就是连续的最大的子数组之和,故此必须在此种情况下也求解出最大子数组之和,方法即是同时从数组的两端依次进行求出各自的最大子数组之和,然后在相遇前求和后与之前所求的最大子数组之和依次相比较,取它们中最大的一个作为连续的最大子