我有一个数据类型,比如说X
,我想知道它的大小而不声明该类型的变量或指针,当然也不使用sizeof
运算符。
这可能吗?我想过使用包含数据类型大小和范围的标准头文件,但这不适用于用户定义的数据类型。
在我看来,这属于“如何在不使用 ++、+= 或 + 的情况下添加两个整数?”的类别。这是浪费时间。您可以尝试通过执行此类操作来避免未定义行为的怪物。
size_t size = (size_t)(1 + ((X*)0));
请注意,我没有声明类型变量或指向X
.
看,sizeof
是用于此的语言工具。只有一个,所以它是实现这一目标的唯一可移植方式。
对于某些特殊情况,您可以生成不可移植的代码,这些代码使用其他启发式方法来了解特定对象的大小[*](可能通过让它们跟踪自己的大小),但是您必须自己做所有的簿记.
[*] 非常一般意义上的对象,而不是 OOP 意义上的对象。
好吧,我是一个业余爱好者..但是我尝试了这个问题,并且在不使用 sizeof 的情况下得到了正确的答案。希望这会有所帮助.. 我正在尝试查找整数的大小。
int *a,*s, v=10;
a=&v;
s=a;
a++;
int intsize=(int)a-(int)s;
printf("%d",intsize);
这个面试问题的正确答案是“我为什么要这样做,当 sizeof() 为我这样做时,并且是这样做的唯一可移植方法?”
填充的可能性在不了解用于引入它的规则的情况下阻止了所有希望。这些是依赖于实现的。
您可以通过阅读特定处理器的ABI来解决这个问题,它解释了结构在内存中的布局方式。每个处理器可能不同。但是,除非您正在编写编译器,否则您不想只使用 令人惊讶的是sizeof
,这是解决此问题的一种正确方法。
试试这个:
int a;
printf("%u\n", (int)(&a+1)-(int)(&a));
如果 X 是数据类型:
#define SIZEOF(X) (unsigned int)( (X *)0+1 )
如果 X 是一个变量:
#define SIZEOF(X) (unsigned int)( (char *)(&X+1)-(char *)(&X) )
查看编译器源代码。你会得到 :
由此,任何东西的预期大小。
如果你至少可以为变量分配空间,并在其中填充一些标记值,你可以一点一点地改变它,看看值是否改变,但这仍然不会告诉你任何关于填充的信息。
试试这个:
#include<stdio.h>
int main(){
int *ptr = 0;
ptr++;
printf("Size of int: %d",ptr);
return 0;
自 C89 解决方案以来可用,在用户代码中:
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 及更高版本。
这是代码:诀窍是创建一个指针对象,保存它的地址,递增指针,然后从前一个地址中减去新地址。关键是当指针增加时,它实际上移动的大小等于它指向的对象的大小,所以这里是类的大小(它指向的对象)。
#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);
}
问候
很多这些答案都假设你知道你的结构会是什么样子。我相信这个面试问题是为了让你跳出框框思考。我一直在寻找答案,但在这里没有找到我喜欢的任何解决方案。我会做一个更好的假设说
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);
假设我的指针算术正确,这应该是票 - 并且它是便携式的!不幸的是,填充、编译器设置等东西也会发挥作用
想法?
把它放到你的代码中
然后检查链接器输出(映射文件)
unsigned int uint_nabil;
unsigned long ulong_nabil;
你会得到这样的东西;
uint_nabil 700089a8 00000004
ulong_nabil 700089ac 00000004
4是大小!!
一种简单的方法是使用数组。现在,我们知道数组中相同数据类型的元素存储在连续的内存块中。所以,通过利用这个事实,我想出了以下几点:
#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;
}
希望这可以帮助。
试试这个,
#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
这考虑到一个 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>
。
# include<stdio.h>
struct node
{
int a;
char c;
};
void main()
{
struct node*ptr;
ptr=(struct node*)0;
printf("%d",++ptr);
}
#include <stdio.h>
struct {
int a;
char c;
};
void main() {
struct node*temp;
printf("%d",(char*)(temp+1)-(char*)temp);
}
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 行中的浮点数更改为要计算其大小的类型
#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;
}