重複の可能性:
sizeofを使用せずに変数のサイズを見つける方法
Cを使用して、sizeof演算子を使用せずに、どういうわけかポインターのサイズを見つけることができますか?グーグル中に多くの場所でこの質問を見つけましたが、答えは見つかりませんでした。どんな助けでも大歓迎です。ありがとう
重複の可能性:
sizeofを使用せずに変数のサイズを見つける方法
Cを使用して、sizeof演算子を使用せずに、どういうわけかポインターのサイズを見つけることができますか?グーグル中に多くの場所でこの質問を見つけましたが、答えは見つかりませんでした。どんな助けでも大歓迎です。ありがとう
これがあなたが使うことができる小さいが合法的なハックです:
int *unused = NULL;
int **ptr = &unused;
printf("%tu\n", ((char*)(ptr+1))-(char*)ptr);
仕組みは次のとおりです。
N
ポインタに追加すると、ポイントN
された型のサイズの倍になることを思い出してください。したがって、の「生の」値に(ptr+1)
追加されますsizeof(int*)
ptr
sizeof(char)
は常に1
なので、にキャストするchar*
と「生の」値を減算できます。結果は、操作sizeof
によって追加され(ptr+1)
ます。#define MY_SIZEOF_VAR(x) ((int)((char*)(&(x)+1)-(char*)&(x)))
#define MY_SIZEOF_TYPE(x) ((int)((char*)((x*)0+1)-(char*)0))
これは、本物ほど良くはありません。unsigned int の方がいいかもしれませんが、うるさくはなりません。
現在使用しているアーキテクチャを確認できます。32 ビット アーキテクチャの場合、ポインタのサイズは... 32 ビットまたは 4 バイトです。64 ビット アーチには 64 ビット、8b ポインターがあります。
編集:まあ、私は1つがあると思います。sizeof()
それでも簡単です。可能であれば、それを使用してください。それ以外の場合は、上記の@dasblinkinlightの回答を参照してください。
sizeofがないと、型プラットフォームのサイズを無差別に見つける方法はありません。なぜあなたがそれを使いたくないのか分かりません。ただし、コードを複雑でひどく、プラットフォームに依存させる場合は、プリプロセッサステートメントを追加して、コンパイラとターゲットアーキテクチャをチェックし、それに応じて、既知の値から値を見つけることができます。
ポインター演算とキャストを使用する
#include <stdio.h>
struct person {
int age, salary;
char name[12];
char address[6][20];
};
typedef struct person EMPLOYEE;
main() {
EMPLOYEE a;
EMPLOYEE *x,*y;
x=&a;
y=x+1;
printf ("pointer arith %d\n", (int)((int)y-(int)x));
printf ("sizeof %ld\n", sizeof(a));
}