3

問題が発生しています。明示的なパラメーターを渡すことなく、int 配列へのポインターだけを渡さずに、int 配列内の要素の数を取得しようとしています。今私の好奇心:

int * set;
printf("-- %d --", sizeof(set)); //4
set=(int *) malloc(n*sizeof(int));
printf("-- %d --", sizeof(set)); //4  

malloc の前と初期化されていないため、値が同じなのはなぜですか。ありがとう
更新:
int 配列の長さを取得する方法はありますか?

4

5 に答える 5

9

sizeofはコンパイル時に評価され、 へのポインタである ののサイズを生成するためです。setint

于 2012-05-04T20:36:35.997 に答える
6

C のポインタが指すメモリのサイズを測定する一般的な方法はありません。慣例により文字列が null で終了するという特殊なケースを除きます。

sizeofポインタのサイズ (32 ビット システムでは 4 バイト、64 ビット システムでは 8 バイト) が得られますが、ポイントされているメモリのサイズは得られません。

割り当てられたメモリのサイズを追跡する場合は、次のオプションがあります。

  • 別の変数で追跡する
  • 特殊な配列ターミネータ (たとえば、アプリケーションがその値を有効に使用しないint 場合の最小値または最大値) を導入します。
  • 別のメモリ管理ライブラリを使用します ( dmallocにはdmalloc_examineがあり、指しているメモリのサイズが返されます)。これらは、拡張メモリ API を使用する場所を除いて、最小限のコード変更またはコード変更なしですぐに使用できるはずです。
于 2012-05-04T20:37:58.523 に答える
3

測定している項目setは、整数へのポインタ ( int*) です。また、整数へのポインタは 4 バイトです。

sizeofポインタに割り当てられたメモリの量を測定しません。「アイテム」自体 (この場合はポインター) のみを測定します。

于 2012-05-04T20:36:48.537 に答える
0
int * set;
printf("-- %d --", sizeof(set)); //4
set=(int *) malloc(n*sizeof(int));
printf("-- %d --", n*sizeof(int)); //n*sizeof(int) is the size of your malloc'd memory

それが役立つことを願っています。最後のステートメントでは、マシン上で 4 バイトだった個々の整数ポインターのサイズをまだ尋ねていました。malloc されたメモリ領域のサイズを取得するには、malloc 関数内と同じ式を使用する必要があります。

また、Mat が私を修正したように、整数ポインターは必ずしも int 自体と同じサイズではありません

于 2012-05-04T20:41:25.843 に答える
0

ポインターは 32 ビットまたは 64 ビットです。

4または8バイトを意味します。

于 2012-05-04T20:36:43.937 に答える