ここから本文です

C言語 char str[8]; str="C_Gengo"; この記述はなぜ駄目なんでしょうか?

pon********さん

2017/10/2606:19:48

C言語
char str[8];
str="C_Gengo";

この記述はなぜ駄目なんでしょうか?

(エラー)

char str[]="C_Gengo";
str="別の文字列"
これがダメなのは分かります。
メモリ上に7+1文字分確保されているので、その上に代入はできないと。。。

ただ前述の内容はどうも理解できません。
回答お願いします。

閲覧数:
79
回答数:
3
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

Hermitさん

2017/10/2606:53:24

代入できるのは、変数
char str[8];と書くと、str は配列を示す識別子(シンボル)でしかないので、代入は不可。

char str[]="C_Gengo";
の場合は初期化なので、str識別子で確保した領域に指定文字列を埋め込む
後から変更したい場合は、strncpyが似た動作になる。

ちなみにANSI対応のC言語では、
char str[7]="C_Gengo";
は可能。(ANSI以前はエラー)
C++では最後に'\0'が必要なのでエラー

  • Hermitさん

    2017/10/2606:58:40

    わかるとはおもうけど、
    char str[8];
    で確保した中身 str[0]~str[7] は変数なので変更可能。
    strcpyなどで書き換えられる。
    当然1つづつ変更(書き換え)も可能。

  • その他の返信(1件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2017/10/26 17:22:55

一番分かりやすかったです。
ありがとうございます。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

n2q********さん

2017/10/2608:34:13

『この記述はなぜ駄目なんでしょうか?』

代入(assignment)なんですよね。配列の代入を認めるとすれば、そこでコピー処理が発動する形になります。CPU に一定程度の負荷が発生するわけですが、それが代入演算子だけで行われて良いのかどうか。C 言語を考案した人の意見としては、駄目でしょそんなの…ということだったのでしょう。

strcpy や memcpy などで関数呼び出しの形で表現してもらえば、そこで負荷がかかることは目に見えて分かります。

たぶん、そういう発想。だから敢えてダメにした。という事だと思われます。

初期化(initialization)においては、元来は処理が発生していませんでした。単に、データの定義に過ぎなかったのです。自動変数である配列に対しては初期化できなかったので。(昔は必ず static を付けたものですよ)

でも、どうせ大した規模じゃないわけだから(自動変数の場合は大きな配列を用意することは元々無理なので)、初期化を認めてもいいじゃないかっていうことになったのだと思います。



『メモリ上に7+1文字分確保されているので、その上に代入はできないと。。。』

ですよね。理屈として成り立ちます。

別の人が C 言語を考案してたら、そういう言語仕様になったかもしれませんね。ていうか、C 言語ではない別の言語ということかと。

ちなみに、C++ でも配列の代入は出来なくしたまま。将来的に変わるのか変えようとしてるのか、その辺は分かりませんが。

2017/10/2606:35:58

配列の代入(=)は宣言時にしか出来ないという、cのお約束。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる