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

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45130167 之前在腾讯实习生笔试的时候,遇到一个问题,当时一点思路也没有,现在想了想,找了一些资料,大体上明白了应该如何去做。
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45130167

之前在腾讯实习生笔试的时候,遇到一个问题,当时一点思路也没有,现在想了想,找了一些资料,大体上明白了应该如何去做。
问题是:
使用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;
}
目录
相关文章
|
8月前
|
编译器 C语言
sizeof,sizeof与strlen的区别
sizeof,sizeof与strlen的区别
68 0
sizeof,sizeof与strlen的区别
|
8月前
按字节赋值的memset
按字节赋值的memset
59 0
|
8月前
|
存储 编译器
strlen()和sizeof()的区别
strlen()和sizeof()的区别
58 0
|
8月前
|
存储 安全 编译器
C/C中sizeof和strlen函数的实现:详细解析sizeof和strlen函数的实现机制、参数说明和使用技巧
C/C中sizeof和strlen函数的实现:详细解析sizeof和strlen函数的实现机制、参数说明和使用技巧
93 1
sizeof与strlen区别
sizeof是关键字,参数可以是各种数据(包括函数,类型,对象,数组,指针……)用于计算数据所占字节大小 strlen是函数,参数类型必须是字符型指针(char *),用于计算字符串,从字符串的第一个地址开始遍历,直到遇到‘\0’停止
87 0
|
C语言
详解sizeof、strlen、指针和数组等组合题
详解sizeof、strlen、指针和数组等组合题
103 0
|
存储 编译器 C++
sizeof 与strlen的区别与联系
sizeof 与strlen的区别与联系
124 0
sizeof 与strlen的区别与联系
|
编译器 C语言 C++
C/C++ 中的 sizeof 运算符和 size_t 类型
C/C++ 中的 sizeof 运算符和 size_t 类型
详解strlen和sizeof在数组中的使用(五)
目录 一、前言 二、sizeof在二维数组的试题 解读: 题解: 答案验证: 64位平台下: 32位平台下:
125 0
详解strlen和sizeof在数组中的使用(五)