1. ホーム
  2. c

[解決済み] C言語による配列の返送

2022-03-04 04:44:54

質問

私は比較的新しいC言語で、配列を扱うメソッドについて手助けが必要です。Javaプログラミングから来た私は、次のように言うことができるのに慣れています。 int [] method() を使うと、配列を返すことができます。しかし、C言語では配列を返すときにポインターを使わなければならないことがわかりました。新しいプログラマーである私は、多くのフォーラムを見たとしても、このことを全く理解できていません。

基本的に、私はCでchar配列を返すメソッドを書こうとしています。私はメソッド(returnArrayと呼ぶことにします)に配列を提供します。それは前の配列から新しい配列を作成し、それへのポインタを返します。これをどのように始めるか、そして配列から送られたポインタをどのように読み取るかについて、いくつかのヘルプが必要です。これを説明するどんな助けでも感謝します。

配列を返す関数のコードフォーマット(案

char *returnArray(char array []){
 char returned [10];
 //methods to pull values from array, interpret them, and then create new array
 return &(returned[0]); //is this correct?
} 

関数の呼び出し元

int main(){
 int i=0;
 char array []={1,0,0,0,0,1,1};
 char arrayCount=0;
 char* returnedArray = returnArray(&arrayCount); ///is this correct?
 for (i=0; i<10;i++)
  printf(%d, ",", returnedArray[i]);  //is this correctly formatted?
}

Cコンパイラが現在動作していないので、まだテストしていませんが、これを解明したいと思います。

どのように解決するのですか?

C言語では関数から配列を返すことはできません。また、このようなこともできません(してはいけません)。

char *returnArray(char array []){
 char returned [10];
 //methods to pull values from array, interpret them, and then create new array
 return &(returned[0]); //is this correct?
} 

returned は自動保存期間付きで作成され、宣言したスコープを離れると、つまり関数が戻ると、それへの参照は無効になる。

関数内部でメモリを動的に確保するか、呼び出し元が提供する事前割り当てバッファを埋める必要があります。

オプション1:

関数内部で動的にメモリを確保する (呼び出し元はメモリの確保解除に責任を持つ) ret )

char *foo(int count) {
    char *ret = malloc(count);
    if(!ret)
        return NULL;

    for(int i = 0; i < count; ++i) 
        ret[i] = i;

    return ret;
}

このように呼び出します。

int main() {
    char *p = foo(10);
    if(p) {
        // do stuff with p
        free(p);
    }

    return 0;
}

オプション 2:

呼び出し元が提供する事前割り当てバッファを埋める(呼び出し元が割り当てた buf を作成し、関数に渡す)

void foo(char *buf, int count) {
    for(int i = 0; i < count; ++i)
        buf[i] = i;
}

そして、このように呼び出します。

int main() {
    char arr[10] = {0};
    foo(arr, 10);
    // No need to deallocate because we allocated 
    // arr with automatic storage duration.
    // If we had dynamically allocated it
    // (i.e. malloc or some variant) then we 
    // would need to call free(arr)
}