No.1
- 回答日時:
C言語で配列を扱うときの基本ですが
「添字の範囲を間違えても、エラーになるとは限らない」
というのがあります。
char str1[]={"big"},str2[]={"city"}, str3[]={0};
これは、配列の要素数をコンパイラが自動で判定するものです。
char str1[4]={"big"},str2[4]={"city"}, str3[1]={0};
と同じになります。
str3配列の内容が 「0」という値が1つあるだけですから、要素数は1です。
この後、str3[1],str3[2],... へ(ポインタcを通して)書き込んでいます。
str3 では宣言されていない場所です。
このような場合、C言語では、指定したとおり(無いはずの)str3[1]str3[2]へ書き込みます。
そうなったとき、どんなことが起こるかは、わかりません。
エラーになるかもしれないし、たまたまうまく動作するように見えるかもしれません。
今回は、そのはみ出した場所がstr2やstr1が使っている領域だったので、str1,str2の内容が変わってしまった、ということでしょう
この回答へのお礼
お礼日時:2017/08/27 20:59
回答ありがとうございますm(_ _)m
こちら初心者のため何処を書き換えたらいいのかも一緒に教えて頂けましたらありがたいです!!
よろしくお願いしますm(_ _)m
No.2
- 回答日時:
#include <stdio.h>
int main(void){
char str1[]={"big"},str2[]={"city"},str3[]={"bigcity"};
printf("str1=%s\n",str1);
printf("str2=%s\n",str2);
printf("str3=%s\n",str3);
return 0;
}
------------------------
以下、実行結果です。
str1=big
str2=city
str3=bigcity
No.3ベストアンサー
- 回答日時:
一つ訂正します
誤) char str1[4]={"big"},str2[4]={"city"}, str3[1]={0};
正) char str1[4]={"big"},str2[5]={"city"}, str3[1]={0};
ベテランでもこういう単純な間違いをすることがあります。
間違えもいいんです。それに気付いて直せれば。
ダメなときは、どこでダメになっているかを調べ、何故ダメになるかを調べ、どうすればダメじゃなくなるかを考えます。
これはベテランでも初心者でも変わりません。
原因は str3[1],str3[2] ...と範囲外に書き込んだことです。
例えるなら、「子供に紙とクレヨン渡したら、調子にのって床にまで絵を描いてしまった」状態です。
よって、対策は
・これらに書きこまないようにする。つまり、配列に収まる大きさの文字列にする
(例えるなら「紙の外に描かないような小さな絵にする」)
・これらが書き込まれても問題ない状態にする。つまり、配列の大きさを十分に大きくする
(例えるなら「絵が入るくらいの大きな紙にする」)
のどちらか、となります。
今回の場合、書き込みたい文字列が決まっているので、前者の「収まる文字列にする」という方法は使えません。
よって、後者の「文字列が収まる配列にする」が正解になります。
配列の大きさの指定方法はわかりますね?
この回答へのお礼
お礼日時:2017/08/28 08:37
わかりやすい回答ありがとうございますm(__)m
初心者には大変わかりやすい例まで出して頂いてありがとうございましたm(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の質問です HTMLでこのようなコードを書いたのですがそれをC言語で同じように書きたいです < 1 2022/08/11 23:38
- 放射線治療・リハビリテーション リハビリ系のお仕事についてです。 将来、リハビリ系のお仕事につきたいと思っているのですが PT、OT 1 2022/05/21 20:31
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語について質問です。 以下のような結果を出すためにはどのようなコードが良いですか?サンプルコード 3 2022/11/01 16:19
- C言語・C++・C# C言語の質問です、プログラミング初心者です このような文字列があった場合 "abcdef☆ghijk 4 2022/11/22 10:56
- 呼吸器・消化器・循環器の病気 健康診断結果について質問です。 今回、心電図で再検査となりました。 内容はST-T異常 のため、精密 1 2022/03/28 00:05
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- 大学受験 高一文系です。先日、試しに2021年度共通テストの国語を解いてみました。結果157/200点でした。 1 2023/02/02 08:07
- Visual Basic(VBA) select caseの入れ子 3 2023/03/08 18:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAで質問です。離れた二...
-
C言語 配列の長さの上限
-
パイソンの
-
C言語で特定列だけを抽出して配...
-
アルファベットの配列を数字の...
-
C言語の配列のサイズ
-
配列を使わずに、変数名を動的...
-
Excel、VBAのユーザーフォーム...
-
本日までの累計を表示させたい!
-
メモリの初期値
-
【C言語】配列の中に配列を入れ...
-
構造体配列を引数とするDLL作成...
-
if文で「配列a[i]が小数ならば...
-
unsigned char の配列で途中で0...
-
配列の参照渡しで型が一致しま...
-
配列内の文字間を排他的論理和...
-
c言語乱数について
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
構造体配列のポインタを引数に
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
配列の参照渡しで型が一致しま...
-
C# Listを使わずに2次元配列の...
-
VBで構造体の配列を関数に渡す...
-
複数の選択範囲の行番号を個別...
-
パイソンの
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
C# 配列の変数宣言について。
-
C言語初心者 ポインタについて...
-
unsigned char配列への入力の仕方
-
テキストファイルから文字列を...
-
ExcelVBAで質問です。離れた二...
-
Redimした動的配列はEraseする...
-
C言語で特定列だけを抽出して配...
-
擬似コード 長さがmの配列でな...
-
メモリの初期値
-
C言語初心者 構造体 課題について
おすすめ情報