-2

重複の可能性:
sizeofを使用せずに変数のサイズを見つける方法

Cを使用して、sizeof演算子を使用せずに、どういうわけかポインターのサイズを見つけることができますか?グーグル中に多くの場所でこの質問を見つけましたが、答えは見つかりませんでした。どんな助けでも大歓迎です。ありがとう

4

5 に答える 5

10

これがあなたが使うことができる小さいが合法的なハックです:

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)ます。
于 2012-12-20T14:49:42.663 に答える
3
#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 の方がいいかもしれませんが、うるさくはなりません。

于 2012-12-20T14:55:57.963 に答える
1

現在使用しているアーキテクチャを確認できます。32 ビット アーキテクチャの場合、ポインタのサイズは... 32 ビットまたは 4 バイトです。64 ビット アーチには 64 ビット、8b ポインターがあります。

于 2012-12-20T14:46:45.840 に答える
0

編集:まあ、私は1つがあると思います。sizeof()それでも簡単です。可能であれば、それを使用してください。それ以外の場合は、上記の@dasblinkinlightの回答を参照してください。

sizeofがないと、型プラットフォームのサイズを無差別に見つける方法はありません。なぜあなたがそれを使いたくないのか分かりません。ただし、コードを複雑でひどく、プラットフォームに依存させる場合は、プリプロセッサステートメントを追加して、コンパイラとターゲットアーキテクチャをチェックし、それに応じて、既知の値から値を見つけることができます。

于 2012-12-20T14:47:02.323 に答える
-2

ポインター演算とキャストを使用する

#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));
}
于 2012-12-20T15:01:00.657 に答える