0

重複
の可能性: sizeof (配列を指すポインター) を見つける方法

配列内の位置間の最大の差分をカウントする次のプログラムがありますが、 sizeof 関数は期待どおりに出力しません。10 ints の大きな配列を渡し、それを sizeof で測定すると、長さが 8 ints であることが出力されます。なぜですか?

#include <stdlib.h>
#include <stdio.h>

int *
measure(int *arr)
{
    int *answer=malloc(sizeof(int)*10);
    answer[0]=0;
    answer[1]=0;
    int size=sizeof(arr)+1;
    printf("%d\n", size);
    int i;
    for(i=0; i<size; i++)
    {
        signed int dif=arr[i]-arr[i+1];
        if(dif<0)
            dif*=-1;
        if(dif>answer[1])
        {
            answer[1]=dif;
            answer[0]=i;
        }
    }  
    return answer;
}

int
main (void)
{
    int arr[10]={77, 3, 89, 198, 47, 62, 308, 709, 109, 932};
    int *ans=measure(arr);
    printf("the biggest dif is %d between nrs %d and %d\n", ans[1], ans[0], ans[0]+1);
    return 0;
}
4

1 に答える 1

5

関数に渡されると、配列はポインターに崩壊します。したがって、それを使用sizeofすると、渡した元の配列のサイズではなく、ポインターのサイズが得られます。

サイズで別のパラメータを渡すか、配列の最初または最後の要素を使用してサイズ情報を格納できます。

于 2012-11-20T00:34:42.463 に答える