0

私は長い間 Java を使用してきましたが、何らかの理由で単純なコードを記述するために C (C++ ではなく ANSI C) を使用する必要があります。外部から関数にポインターを渡し、ポインターにメモリを割り当て、関数が戻る前にもいくつかの値を割り当てる必要があります。私は自分のコードを次のように持っています

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

void test(int *a)
{
  int n=3;
  // I have to call another function t determine the size of the array
  n = estimatesize(); // n >=3
  // I tried fix size n=10 also

  a = (int*)malloc(n*sizeof(int));
  a[0] = 1;
  a[1] = 2;
  a[2] = 3;
}

void main(void)
{
  int *s=NULL;
  test(s);
  printf("%d %d %d", s[0], s[1], s[2]);
}

コードがクラッシュする理由がわかりません。最初は推定サイズ()が間違った数を返すと思っていましたが、nを10に修正してもエラーはまだあります。では、メモリ割り当てのためにポインタを関数に渡すことはできませんか? もしそうなら、どうすれば関数内でメモリを動的に作成して渡すことができますか? このように安全な問題かもしれないことは知っていますが、それが可能かどうか、またその方法を知りたいだけです。ありがとう。

4

1 に答える 1

2

これには 2 つの解決策があります。関数からポインターを返すか、参照によって引数を渡します。

最初のものでは、単に引数を取らず、代わりにポインターを返します。

int *test(void)
{
    int *a = malloc(...);
    ...
    return a;
}

int main(void)
{
    int *s = test();
    ...
}

2 番目のものについては、アドレス演算子を使用して、ポインターのアドレス、つまりポインターへのポインターを渡す必要があります&

void test(int **a)
{
    *a = malloc(sizeof(int) * 3);

    for (int i = 0; i < 3; ++i)
        (*a)[i] = i;
}

int main(void)
{
    int *s;
    test(&s);
    ...
}

現在動作しない理由は、ポインター ( sin main) がコピーによって渡されるためです。そのため、関数testにはローカル コピーがあり、そのスコープはtest関数内のみです。関数内の変更aは、test関数が戻ると失われます。そしてs、引数にコピーされているように、実際には値を変更することはなく、関数呼び出しのs後であることを意味します。mainNULL

于 2013-11-04T06:24:21.500 に答える