1

私は現在、テキストC: How to program 6/eを使用して C プログラミングを勉強しています。

さて、配列について議論するときの本では、配列を関数に渡すとき(「\ 0」文字のために文字配列以外)、配列内の要素の数をに渡す必要があると述べています機能も

だから私の機能を考えると

int myfunct(int myary[], int numelements);

int myfunct(int *myary, int numelements);

ary が 10 個の要素で宣言されており、現在 main 関数にいるとします。

myfunct(ary, 10); 

( int numelements[どちらの場合でも] 必要で、必要な場合はその理由) です。この本は、コンパイラが処理する要素の正しい数を知ることであると述べていますが、本はその後、ほとんどすべての例でこれを行わず、非常に一貫性がありません.

また、

int myfunct(int myary[][10], int numrows, int numcolumns);

numrows と numcolumns に関する同じ質問。

さらに説明するには:

#include <stdio.h>
void test(const int ary[]);

int main(void){

    int myary[10] = {1,2,3,4,5,6,7,8,9,10};
    test(myary);

    return 0;
}

void test (const int ary[]){
    int i;

    for(i = 0; i<10; i++){
        printf("The number in array element %d is:    %d\n", i, ary[i] );
    }
}

このコードは、追加のパラメーターなしで正しくコンパイルされるようですが、本がなぜそれらが必要だと言っているのか理解できません。多くのサイトもそうです。ヘルプ!

4

3 に答える 3

4

それは必要ですか?引数として配列サイズを渡さない場合、コードはコンパイルされますか?

配列サイズを引数として関数に渡さなくても、コードはコンパイルされます。
しかし、そうするのは良い習慣です。

根拠:

C は、配列の境界チェックの手段を提供しません。配列のインデックス付けまたはポインター演算を介して配列の境界を超えてアクセスできます (フードの下では、両方とも同じです)。コンパイラーはそれについて警告する必要はありません。しかし、Undefined Behaviorを取得することになります。
したがって、配列に属するメモリにのみアクセスすることが重要です。これを行うには、配列のサイズを追跡する必要があります。これはユーザーの責任です。

配列を引数として渡すと、配列の最初の要素へのポインターとして減衰します。
したがってsizeof(arg)、関数内では、配列ではなくポインターのサイズが得られます。

関数内の配列のサイズを知る方法はありません ( null で終了する文字列を除き、 によってサイズを取得できますstrlen) 引数として渡すか、他のブックイーピング (グローバル変数など) を介して渡す場合を除きます。

これを行う最も明白な方法は、サイズを引数として渡すことです。

于 2013-01-12T06:24:00.730 に答える
1

引数として要素数を指定する必要はありますか?

ほとんどの場合、はい。既に述べたように、 null で終わる C stringを渡す場合は必要ありません。

もしそうなら、なぜですか?

関数が配列にいくつの要素があるかを知る方法は他にないからです。したがって、関数がそれを知る必要がある場合は、その情報を提供する必要があります。

于 2013-01-12T06:25:05.473 に答える
0

より適切なステートメントは、関数が何をすべきかを知る必要があるということです。特に、配列で使用する要素の数を知る必要があります。

パラメータに数値を渡すか、定数を使用して関数に組み込むか、何らかの方法で配列の最後の要素をマークするか (たとえば、文字列の '\o' 文字)、または他の手段 (たとえば、数値を計算できるパラメータ、またはグローバル変数 [これは通常、設計上の不適切な選択です])。

要するに、これは単に必要性に関するものです。コードには、その仕事を行うために必要な情報が含まれていなければなりません。Cについては特にありません。

于 2013-01-12T10:49:23.943 に答える