2

Cで動的配列を使用する方法を学んでいます。私がやりたいのは、動的配列を作成dataし、関数を使用して最初のエントリに「1」を入れることtest()です。

void test(void)
{

data[0] = 1;

}


int main(void)
{

int *data = malloc(4 * sizeof *data);

test();

return 0;
}

これはVisualStudio2010でコンパイルされますが、実行時にプログラムがクラッシュします。を使用する代わりに、作品test()を使用しdata[0] = 1ます。

私の(初心者の)推測では、data関数へのポインタを渡す必要がありますtest()。これはどのように書くべきですか?

試み

void test(int *data)
{

data[0] = 1;

}

次に、単にの代わりにmain使用中。test(data)test()

編集

試みはうまくいきます。しかし、これはそれを行うための「適切な」方法ですか?

4

3 に答える 3

2

Cでローカル変数(動的または静的、配列かどうか)を使用する場合は、それを使用する関数に渡す必要があります。それがあなたの最初のコードの何が問題なのか、test()何も知りませんdata

配列(動的または静的)を宣言するときは、同じ方法で配列を関数に渡すことができます。次のコードはかなり無意味ですが、動的配列の使用は実際には静的配列と同じであることを示しています。

void assign_function(int arr[], int len_of_arr, int *arr2, int len_of_arr2);
void print_function(int *arr, int len_of_arr, int arr2[], int len_of_arr2);

int main()
{
    int data[2] = {0}; // static array of 2 ints
    int *data2 = malloc(3 * sizeof(int)); // dynamic array of 3 ints

    assign_function(data, 2, data2, 3);
    print_function(data2, 3, data, 2);

    free(data2); // One difference is you have to free the memory when you're done

    return 0;
}

したがって、動的または静的に、ポインターを介して、またはポインターとして配列を渡すことができますが、配列の大きさを知るために、同様array[]に渡す必要があります。int

void assign_function(int arr[], int len_of_arr, int *arr2, int len_of_arr2)
{
    int count;
    for(count = 0; count < len_of_arr; count++) //This is the static array
        arr[count] = count;

    for(count = 0; count < len_of_arr2; count++) //This is the dynamic array
        arr2[count] = count;
}

次に、楽しみのために、どの配列がここに渡されarr、どのようにアクセスされるかを逆にします。arr2

void print_function(int *arr, int len_of_arr, int arr2[], int len_of_arr2)
{
    int count;
    for(count = 0; count < len_of_arr; count++)   //This is the dynamic array now
        printf("arr[%d] = %d\n", count, *(arr+count));

    for(count = 0; count < len_of_arr2; count++)  //And this is the static array
        printf("arr2[%d] = %d\n", count, *(arr2+count));
}

ポイントは、ポインタを介して[]、またはポインタとして通過し、経由または差分ポインタにアクセスする[]のはあなた次第です。どちらも問題なく、両方とも機能します。ポインタは読みにくく、書き込み時にエラーが発生しやすい傾向があるため、できる限りポインタを避けるようにしています。

于 2012-12-06T15:20:27.327 に答える
1

次の 2 つの方法で配列を動的に渡すことができます。

  • 単純なポインターを使用してから、ポインター演算を使用して操作する
void test (int * data, int i)
{
    *(data + i) = 1; //This sets data[i] = 1
}
  • またはこの方法:
void test(int data[], int i)
{
    data[i] = 1; //This is the more familiar notation
}

これらの方法のいずれかが、これを行うための「適切な」方法です。

于 2012-12-06T14:51:23.700 に答える
0

test の変数 'data' はローカル スコープです。メインにあるのは同じ「データ」ではありません。test() のパラメーターを介して「データ」へのポインターを渡す必要があります。

于 2012-12-06T14:49:55.857 に答える