21

我有一个数据类型,比如说X,我想知道它的大小而不声明该类型的变量或指针,当然也不使用sizeof运算符。

这可能吗?我想过使用包含数据类型大小和范围的标准头文件,但这不适用于用户定义的数据类型。

4

21 回答 21

44

在我看来,这属于“如何在不使用 ++、+= 或 + 的情况下添加两个整数?”的类别。这是浪费时间。您可以尝试通过执行此类操作来避免未定义行为的怪物。

size_t size = (size_t)(1 + ((X*)0));

请注意,我没有声明类型变量或指向X.

于 2009-08-02T16:40:52.823 回答
12

看,sizeof 用于此的语言工具。只有一个,所以它是实现这一目标的唯一可移植方式。

对于某些特殊情况,您可以生成不可移植的代码,这些代码使用其他启发式方法来了解特定对象的大小[*](可能通过让它们跟踪自己的大小),但是您必须自己做所有的簿记.

[*] 非常一般意义上的对象,而不是 OOP 意义上的对象。

于 2009-08-02T16:27:05.040 回答
11

好吧,我是一个业余爱好者..但是我尝试了这个问题,并且在不使用 sizeof 的情况下得到了正确的答案。希望这会有所帮助.. 我正在尝试查找整数的大小。

int *a,*s, v=10;

a=&v;

s=a;

a++;

int intsize=(int)a-(int)s;

printf("%d",intsize);
于 2009-08-05T15:03:37.963 回答
6

这个面试问题的正确答案是“我为什么要这样做,当 sizeof() 为我这样做时,并且是这样做的唯一可移植方法?”

于 2009-08-05T15:27:19.190 回答
4

填充的可能性在不了解用于引入它的规则的情况下阻止了所有希望。这些是依赖于实现的。

于 2009-08-02T16:28:42.523 回答
3

您可以通过阅读特定处理器的ABI来解决这个问题,它解释了结构在内存中的布局方式。每个处理器可能不同。但是,除非您正在编写编译器,否则您不想只使用 令人惊讶的是sizeof,这是解决此问题的一种正确方法。

于 2009-08-02T16:29:29.013 回答
3

试试这个:

int a;
printf("%u\n", (int)(&a+1)-(int)(&a));
于 2009-11-15T08:33:55.953 回答
3

如果 X 是数据类型:

#define SIZEOF(X) (unsigned int)( (X *)0+1 )

如果 X 是一个变量:

#define SIZEOF(X) (unsigned int)( (char *)(&X+1)-(char *)(&X) )
于 2011-02-11T11:30:04.267 回答
2

查看编译器源代码。你会得到 :

  • 标准数据类型的大小。
  • 结构填充的规则

由此,任何东西的预期大小。

如果你至少可以为变量分配空间,并在其中填充一些标记值,你可以一点一点地改变它,看看值是否改变,但这仍然不会告诉你任何关于填充的信息。

于 2009-08-02T16:26:14.153 回答
1

试试这个:

 #include<stdio.h>

int main(){

  int *ptr = 0;

  ptr++;
  printf("Size of int:  %d",ptr);

  return 0;
于 2013-07-06T10:55:53.400 回答
1

自 C89 解决方案以来可用,在用户代码中:

  1. 不声明 X 类型的变量。
  2. 不声明指向 X 类型的指针。
  3. 不使用sizeof运算符。

正如@steve jessop所暗示的,使用标准代码很容易做到

offsetof(type, member-designator)

它扩展为具有 type 的整数常量表达式size_t,其值是以字节为单位的偏移量,到结构成员 ...,从其结构的开头 ... C11 §7.19 3

#include <stddef.h>
#include <stdio.h>

typedef struct {
  X member;
  unsigned char uc;
} sud03r_type;

int main() {
  printf("Size X: %zu\n", offsetof(sud03r_type, uc));
  return 0;
}

注意:此代码使用"%zu"需要 C99 及更高版本。

于 2017-02-22T00:00:14.437 回答
0

这是代码:诀窍是创建一个指针对象,保存它的地址,递增指针,然后从前一个地址中减去新地址。关键是当指针增加时,它实际上移动的大小等于它指向的对象的大小,所以这里是类的大小(它指向的对象)。

#include<iostream>
using namespace std;
 class abc
    {
           int a[5];
           float c;           
    };
main()
{
    abc* obj1;
    long int s1;
    s1=(int)obj1; 
    obj1++;
    long int s2=(int)obj1;
    printf("%d",s2-s1);
}

问候

于 2012-10-07T17:44:47.533 回答
0

很多这些答案都假设你知道你的结构会是什么样子。我相信这个面试问题是为了让你跳出框框思考。我一直在寻找答案,但在这里没有找到我喜欢的任何解决方案。我会做一个更好的假设说

struct foo {
  int a;
  banana b;
  char c;
  ...
};

通过创建 foo[2],我现在将在内存中有 2 个连续的 foo 对象。所以...

foo[2] buffer = new foo[2];
foo a = buffer[0];
foo b = buffer[1];

return (&b-&a);

假设我的指针算术正确,这应该是票 - 并且它是便携式的!不幸的是,填充、编译器设置等东西也会发挥作用

想法?

于 2013-03-09T21:03:34.937 回答
0

把它放到你的代码中

然后检查链接器输出(映射文件)

unsigned int  uint_nabil;
unsigned long  ulong_nabil;

你会得到这样的东西;

uint_nabil 700089a8 00000004
ulong_nabil 700089ac    00000004

4是大小!!

于 2017-06-24T18:48:53.377 回答
0

一种简单的方法是使用数组。现在,我们知道数组中相同数据类型的元素存储在连续的内存块中。所以,通过利用这个事实,我想出了以下几点:

#include <iostream>
using namespace std;

int main()
{
    int arr[2];
    int* ptr = &arr[0];
    int* ptr1 = &arr[1];
    cout <<(size_t)ptr1-(size_t)ptr;
}

希望这可以帮助。

于 2017-10-03T19:27:47.447 回答
-1

试试这个,

#define sizeof_type( type )  ((size_t)((type*)1000 + 1 )-(size_t)((type*)1000))

对于以下用户定义的数据类型,

struct x
{
    char c;
    int i;
};

sizeof_type(x)          = 8
(size_t)((x*)1000 + 1 ) = 1008
(size_t)((x*)1000)      = 1000
于 2010-11-12T07:41:55.920 回答
-1

这考虑到一个 C++ 字节并不总是 8 个二进制位,并且只有无符号类型具有明确定义的溢出行为。

#include <iostream>
int main () {
    unsigned int i = 1;
    unsigned int int_bits = 0;
    while (i!=0) {
        i <<= 1;
        ++int_bits;
    }

    unsigned char uc = 1;
    unsigned int char_bits = 0;
    while (uc!=0) {
        uc <<= 1;
        ++char_bits;
    }

    std::cout << "Type int has " << int_bits << "bits.\n";
    std::cout << "This would be  " << int_bits/8 << " IT bytes and "
              << int_bits/char_bits << " C++ bytes on your platform.\n";
    std::cout << "Anyways, not all bits might be usable by you. Hah.\n";
}

当然,你也可以只是#include <limit>or <climits>

于 2011-06-17T11:36:54.320 回答
-1
# include<stdio.h>

struct node
{
  int a;
  char c;
};

void main()
{
   struct node*ptr;
   ptr=(struct node*)0;
   printf("%d",++ptr);
}
于 2012-10-08T16:54:36.533 回答
-1
#include <stdio.h>

struct {
  int a;
  char c;
};

void main() {
  struct node*temp;
  printf("%d",(char*)(temp+1)-(char*)temp);
}
于 2012-10-08T17:00:55.610 回答
-1
    main()    
    {
    clrscr();
    int n;
    float x,*a,*b;//line 1
    a=&x;
    b=(a+1);
    printf("size of x is %d",
    n=(char*)(b)-(char*)a);
    }

通过此代码脚本,无需 sizeof 运算符即可计算任何数据的大小。只需将第 1 行中的浮点数更改为要计算其大小的类型

于 2015-03-29T16:13:16.513 回答
-2
#include <bits/stdc++.h> 

using namespace std; 

int main() 
{ 

    // take any datatype hear 
    char *a = 0; // output: 1

    int  *b = 0;  // output: 4

    long *c = 0; // output: 8

    a++;

    b++;

    c++;

    printf("%d",a);

    printf("%d",b);

    printf("%d",c);

    return 0; 
}
于 2018-09-10T11:34:32.523 回答