[解決済み] C言語による配列の返送
質問
私は比較的新しい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)
}
関連
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] オブジェクトが配列であるかどうかを確認するにはどうすればよいですか?[重複]。
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み】配列に何かを追加する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】単項演算子「*」の型が無効(「int」がある)C言語でのエラー
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"