在不使用 sizeof 的情况下查找大小
Finding size without using sizeof
我知道我们可以使用以下方法找到特定类型指针的大小:
printf("size of an int pointer: %d", sizeof(int*));
printf("size of a float pointer: %d", sizeof(float*));
printf("size of pointer to void: %d", sizeof(void*));
在 C 中,是否可以在不需要使用 sizeof
的情况下找到 struct
的大小?
是的,我们可以在不使用 sizeof
的情况下执行以下操作来查找 struct
的大小:
struct myStruct
{
int a;
int b;
}
struct myStruct s = {0, 0};
myStruct *structPointer = &s;
unsigned char *pointer1, *pointer2;
pointer1 = (unsigned char*) structPointer;
pointer2 = (unsigned char*) ++structPointer;
printf("%d", pointer2 - pointer1);
执行指针运算并测量步长。
#include <stdio.h>
struct foo { char a[5],b[98];};
#define SYZEOV(t) ((size_t)((void*)(((t*)(NULL))+1)-NULL))
int main(int m, char**n){
printf("sizeexpr=%ld\n", (long)((void*)(((struct foo*)(NULL))+1)-NULL));
printf("syzeov =%ld\n", (long)SYZEOV(struct foo));
printf("sizeof =%ld\n", (long)sizeof(struct foo));
return 0;
};
简而言之,你不能。有些人建议使用指针算法,就像您在回答中所做的那样,以及使用宏来制作 "a sizeof operator." 原因是数据类型的大小仅由机器的编译器知道。您的指针算法正在使用 sizeof 运算符 "behind the scenes".
C 的设计方式是 sizeof
始终 returns 移动到下一个数组元素的指针增量(以字节为单位),因此 sizeof(type[N]) == N*sizeof(type)
始终为真.
那么你可以选择使用哪一个。
然后,sizeof
和指针增量都不是真正的 return 操作数的大小,相反,它们都是 return 每个对象在创建时占用的内存量一个数组。
试试这样的东西:
struct myStruct
{
double a;
char b;
}
那么sizeof(struct myStruct)
很可能是2*sizeof(double)
,而不是sizeof(double)+sizeof(char)
,因为当你做一个myStruct
的数组时,下一个数组元素必须那么远离开。
myStruct
真的用那么多space吗?可能不会。
如果你这样做:
struct myBigStruct
{
struct myStruct small;
char b;
}
那么sizeof(struct myBigStruct)
很有可能还是2*sizeof(double)
,而不是sizeof(struct myStruct)+sizeof(char)
所有这些都取决于实现。
只是因为太多人假设sizeof(type[N]) == N*sizeof(type)
所以C通过这样使sizeof
强制它是真的
我知道我们可以使用以下方法找到特定类型指针的大小:
printf("size of an int pointer: %d", sizeof(int*));
printf("size of a float pointer: %d", sizeof(float*));
printf("size of pointer to void: %d", sizeof(void*));
在 C 中,是否可以在不需要使用 sizeof
的情况下找到 struct
的大小?
是的,我们可以在不使用 sizeof
的情况下执行以下操作来查找 struct
的大小:
struct myStruct
{
int a;
int b;
}
struct myStruct s = {0, 0};
myStruct *structPointer = &s;
unsigned char *pointer1, *pointer2;
pointer1 = (unsigned char*) structPointer;
pointer2 = (unsigned char*) ++structPointer;
printf("%d", pointer2 - pointer1);
执行指针运算并测量步长。
#include <stdio.h>
struct foo { char a[5],b[98];};
#define SYZEOV(t) ((size_t)((void*)(((t*)(NULL))+1)-NULL))
int main(int m, char**n){
printf("sizeexpr=%ld\n", (long)((void*)(((struct foo*)(NULL))+1)-NULL));
printf("syzeov =%ld\n", (long)SYZEOV(struct foo));
printf("sizeof =%ld\n", (long)sizeof(struct foo));
return 0;
};
简而言之,你不能。有些人建议使用指针算法,就像您在回答中所做的那样,以及使用宏来制作 "a sizeof operator." 原因是数据类型的大小仅由机器的编译器知道。您的指针算法正在使用 sizeof 运算符 "behind the scenes".
C 的设计方式是 sizeof
始终 returns 移动到下一个数组元素的指针增量(以字节为单位),因此 sizeof(type[N]) == N*sizeof(type)
始终为真.
那么你可以选择使用哪一个。
然后,sizeof
和指针增量都不是真正的 return 操作数的大小,相反,它们都是 return 每个对象在创建时占用的内存量一个数组。
试试这样的东西:
struct myStruct
{
double a;
char b;
}
那么sizeof(struct myStruct)
很可能是2*sizeof(double)
,而不是sizeof(double)+sizeof(char)
,因为当你做一个myStruct
的数组时,下一个数组元素必须那么远离开。
myStruct
真的用那么多space吗?可能不会。
如果你这样做:
struct myBigStruct
{
struct myStruct small;
char b;
}
那么sizeof(struct myBigStruct)
很有可能还是2*sizeof(double)
,而不是sizeof(struct myStruct)+sizeof(char)
所有这些都取决于实现。
只是因为太多人假设sizeof(type[N]) == N*sizeof(type)
所以C通过这样使sizeof
强制它是真的