0

重複の可能性:
目的 c の配列

配列の長さを見つける方法に疑問があります.....

私のコードは

#import <Foundation/Foundation.h>

void myFunction(int i, int*anBray);


int main(int argc, const char * argv[])
{
    int anBray[] = {0,5, 89, 34,9,189,9,18,99,1899,1899,18,99,189, 34,89, 34,89, 34,89, 34,89, 34,89, 34,89, 34,89, 34,89, 34,89, 34,89, 34,89, 34,89, 34,89, 34,2,600,-2,0};
    int i;    

    NSLog (@"Input:");
    for (i=0; i<sizeof(anBray)/sizeof(int); i++)
        NSLog(@ " anBray[%i]= %i ",i,anBray[i]); 

    NSLog (@"Output");

    myFunction(i,anBray);

    return 0;

}

void myFunction(int i, int*anBray) {

    for ( i=0;  i<anBray; i++) {
        if ( anBray[i] == 0) {
            anBray[i] = anBray[i+1] - anBray[i]; 
        } else {
            anBray[i] = anBray[i] - anBray[i];
            anBray[i] = anBray[i+1] - anBray[i];
        }
        NSLog(@ " anBray[%i]= %i",i,anBray[i]); 

    }

}

関数「void myFunction」では機能しますが、ガベージ値も与えます.どうすれば適切に機能しますか? 助けてください...

4

2 に答える 2

1

for(i = 0; i <anBray; i ++){行は意味がありません。ポインタを整数と比較しようとしています。

配列のサイズを決定するには、main関数で行ったように、特定の場合にsizeof anBray / sizeofanBray[0]またはsizeofanBray/ sizeof(int)を使用して実行できます。

ただし、myFunction関数では、intポインターを受け入れているため、ポインターが指す配列のサイズを取得することはできません。このintポインターは、anBrayの最初の要素を指します。つまり、以下は同等です。

myFunction(i, anBray);
myFunction(i, &anBray[0]);

myFunctionから配列サイズを判別できないため、サイズ(実際には、バイト単位のサイズではなく要素数)を渡すか、配列の最後に既知の番兵値(-1など)を使用して検出する必要があります。次に、最後に到達するまでループできます。例:

#include <stdio.h>

void f(int nelem, int *a) {
    int e;
    for (e = 0; e < nelem; e++) // Now the element count is known.
        printf("a[%d] = %d\n", e, a[e]);
}

int main(void) {
    int x[] = { 5, 6, 7, 8 };
    // The number of elements in an array is its total size (sizeof array)
    // divided by the size of one element (sizeof array[0])
    // Here we pass it as the first argument to f()
    f(sizeof x / sizeof x[0], x);
    return 0;
}
于 2012-07-09T10:43:47.793 に答える
0

Cのどのフレーバーでも、次元なしで宣言された配列(たとえば、NSArray)のサイズを決定することはできません。情報は単に取得するためにそこにありません。配列は純粋に最初の要素へのポインターとして渡され、配列とともに格納された、または何らかの方法でポインターとともに渡された次元情報はありません。

Javaのような言語では、配列自体がオブジェクトであり、その次元を含むヘッダーがあります。しかし、Cでは、配列はどこかのスペースへの単なるアドレスです。

于 2012-07-09T11:19:28.920 に答える