[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
質問
私はC言語プログラミングの全くの初心者で、C言語の前に取り組んでいた言語はJavaです。あるメソッドがchar配列を返すようにしようとしているのですが、うまくいきません。以下は私の構文です。
char * insertToArray(char * val){
int k;
char arr[2] = val;
// do some other staffs here to the value
return arr;
}
int main(){
char s1[] = {"one", "two"};
char newArr[];
int i;
for(i = 0; i < 2; i++){
newArr[] = insertToArray(s1[i]);
}
return 0;
}
私が行おうとしているのは
s1
配列から
insertToArray
で、その値に対して何らかの計算を行い、全く新しい単一の配列を返します。私は全くの初心者で、ネット上で他のヘルプを見つけることができませんでした。私は何を間違えているのでしょうか?
解決方法は?
C言語のルールでは、ポインタを使って配列を初期化してはいけないことになっています。代わりに配列を定義して、そこにコピーします。
char arr[strlen(val) + 1]; // Make sure there's enough space
strcpy(arr, val);
それから、空の配列を定義することはできません。配列にはサイズが必要です。また、配列は
newArr
の中に
main
を返すので、この関数はとにかく間違っています。
ポインタ
. そこで
newArr
もポインタでなければならない。
さて、それはさておき、あなたの(現在の)コードには、他にもいくつか非常に間違った点があります。
1つ目は、配列のサイズです。
arr
. 2文字の配列は、1文字の文字列のためのスペースしか保持できません。文字列はヌル文字で終端しているため、完全な文字列を格納するスペースが必要です。
プラス
があります。
2つ目の問題は、ローカル変数へのポインタを返していることです。一度、関数
insertToArray
を返すと、そのローカル変数はすべて存在しなくなります。それらの変数の一つへのポインタを持っていると、次のようなことが起こります。
未定義の動作
を使用した場合。
最初の問題の解決策は上記の通りです。2番目の問題の解決は少し難しく、関数に追加の引数を渡すか、動的にメモリを確保するかのどちらかを行う必要があります。私は余分な引数を渡す方法をお勧めします。
char * insertToArray(const char * val, char * arr){
strcpy(val, arr);
// do some other staffs here to the value
return arr;
}
そして、次のように呼び出します。
char newArr[strlen(s1[i]) + 1];
insertToArray(s1[i], newArr);
関連
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み] C言語による配列の返送
-
[解決済み] 配列の反復処理に "for...in "を使用するのは、なぜ良くないのでしょうか?
-
[解決済み] Javaで配列をリストに変換する
-
[解決済み] Bashで文字列を配列に分割する方法は?
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み】ArrayとList<T>の比較。いつどちらを使うか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み】変数の警告が設定されているが使用されていない
-
[解決済み】 `S_ISREG()` とは何ですか、そして何をするのですか?
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み] テスト
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】fgetsによるセグメンテーションフォールト(コアダンプ) - と思う。
-
[解決済み】配列型char[]が代入できない [重複]。