0

こんにちは、私はこの演習を行っていて、配列へのポインターを関数に渡した後に配列のサイズを取得したいと考えていました。

ただし、 sizeof() 演算子はポインターでは機能しませんが、配列名では機能します。なぜそうなのですか?これは、findPut 関数で配列のサイズを取得できる方法ですか?

#include <stdio.h>

//global vars
int i,j;
//functions prototypes
void findPut(int *, int);

int main(void){
    int ins=4;
    int arr[10]={1,2,3,5,6,7,8};
    printf("%d\n",sizeof(arr));     //gives 40
    int *ap=arr;
    printf("%d\n",sizeof(*ap));     //gives 4 instead of 40 why?? if ap and arr the same thing


    findPut(ap, ins);
    return 0;
}

//functions
void findPut(int *p, int n){
    //vars
    //getting size of array
    int size= sizeof(*p);   
    //sizeof(int);
    printf("%d\n",size);        //gives 4 but expected 40????

}
4

3 に答える 3

3

逆参照*pすると が取得されるintため、4 が返されます (これはintプラットフォーム上の のサイズです)。

于 2013-06-08T13:06:54.793 に答える
3

sizeof(*ap)は、sizeof(arr[0]);配列のタイプが であるintことを意味します。システム構成では、サイズが であるため、結果は になります。sizeof(int)int44

の値を出力して自分で試すことができます。*pの値が得られますarr[0]

をポインタint *pにして、int arr[10]

その点に注意してください:

  1. Arraysポインタは同等ではありません
  2. sizeofoperator はコンパイル時の演算子です。
  3. sizeof(arr)、評価すると10*sizeof(int)、それは10*4=40あなたの場合です。
  4. p を逆参照する (p が指す値を取得する) と、配列全体が得られるわけではありませんが、配列の 1 つの単位がそうであるintことを*p意味しarr[0]ます。sizeof(arr[0])明らかな4(あなたの場合)です。
  5. を使用するsizeof(p)と、マシンのポインターのサイズが得られます。私のマシンでは8です。
  6. main関数の戻り値の型はint常にする必要があります。オペレーティング システムにプログラムの終了ステータスを報告する必要があります。使用するvoidと、ランダムなガベージが返される場合があります。

例は問題を示します:

#include<stdio.h>
#include<stdlib.h>
int main(){
  int *p=NULL;
  int arr[10]={10,1,2,3,5,6,7,8,9,10};
  p=arr;
  printf("values: arr[0]=%d  *p= %d\n\n",arr[0],*p);
  printf("sizes : sizeof(arr[0])=%lu, sizeof(*p)= %lu sizeof(int)=%lu\n\n",sizeof(arr[0]),sizeof(*p),sizeof(int));
  printf("Sizeof pointer p: %lu \n\n",sizeof(p));
  printf("Sizeof arr: %lu \n\n",sizeof(arr));

  printf("Pointing p to the first byte of 100 byte sequence\n\n");
  p=malloc(100);

  printf("Though p is pointing 100 byte block, sizeof(p)=%lu",sizeof(p));
  return 0;
}

基本的に、sizeof評価しますが、 it が指すものは評価しsizeof typeません。sizeof type

ありがとう、私はあなたの知識に感謝しますが、別の関数内の配列のサイズを見つける方法はありますか(私が配列を定義するものではありません)。

あなたは私の私見ではできません!配列とともにサイズを渡す必要があります。

例:

 int main(){
   int arr[10]={10,1,2,3,4,5};
   printf("Length of array: %lu",findLength(arr,sizeof(arr)));
   return 0;
 }
 size_t findLength(int *p,int size){
    return size/sizeof(*p);
 }
于 2013-06-08T13:08:18.773 に答える
0

int配列とintポインターがあります。

int arr[10] = {1,2,3,5,6,7,8};
int* ap;
ap = arr;

C では、式arrは と同等&arr[0]です。これは、バイナリのサイズが 4 である*apと同等です。arr[0]int

また、配列とポインターは同じものではないことも理解する必要があります。配列とポインターは、ポインターが配列の先頭のアドレス (つまり、最初の要素) を格納し、あたかも配列のように連続するアドレスをナビゲートできるという意味で、しばしば同じ意味で使用されるという事実に混乱したかもしれません。渡された実際の配列。

于 2013-06-08T13:13:14.660 に答える