【C言語】【ワーニング対処】「passing argument 1 to restrict-qualified parameter aliases with argument 3」

プログラミング
スポンサーリンク

こんばんわ。

久々にC言語を扱う機会があり、作成済のソースファイルをメンテナンスする事になったんですが、いざコンパイル(make)した時に、色々調べたりした内容を記事として纏めました。

※本シリーズは、都度作成しようと考えてます。

問題となるコード

期待する動作は、以下となります。

・「buf1に”abcdeABCDE”」を設定したい

char buf1[11];
char buf2[6];

strcpy(buf1, "abcde");
strcpy(buf2, "ABCDE");

sprintf(buf1, "%s%s", buf1, buf2);

どこが問題となるでしょうか?

原因

上記で問題となるのは、sprintf()の使い方です。

sprintf()文ではoutputとinputに同じ変数を指定する事は、C標準では未定義(どのような結果になるか分からない)です。

(本例だと、第1引数(output)と第3引数(input)に同じ変数(buf)を指定しているので、ワーニングが出ている)

※なお、未定義とはいえ、ほとんどの処理系では期待した結果が得られます。(「buf1に”abcdeABCDE”」が設定される)

対処

strcat()関数などを用いて連結します。(あくまで一例です)

char buf1[11];
char buf2[6];

strcpy(buf1, "abcde");
strcpy(buf2, "ABCDE");

strcat(buf1, buf2);

一応補足すると、memcpy()でも同様の結果が得られます。

個人的には、取り扱う対象のデータ型(今回の場合は文字列※)によって、利用する関数やコーディングを変更・選択するのが、よりベターと考えているので、今回はstrcat()を紹介しました。

※変数型(char)という事ではなく、変数に”abcde”,”ABCDE”と設定しており、文字列を設定していることを指しています。

コメント

タイトルとURLをコピーしました