1. ホーム
  2. c

[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?

2022-02-04 20:34:16

質問

私は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);