構造体 – プログラミング – Home

通知
すべてクリア

構造体

固定ページ 1 / 2

どたんば
 どたんば
(@どたんば)
ゲスト
結合: 22年前
投稿: 3
Topic starter  

#include <stdio.h>

struct CPU{
char name;
int syuuhasuu;
double chokkei;
double takasa;
};
struct CPU first;

int main(void)
{
printf(それぞれに値を入力してください。\n);
printf(名前-->); scanf(%s, &first.name);
printf(周波数-->); scanf(%d, &first.syuuhasuu);
printf(直径-->); scanf(%lf, &chokkei);
printf(高さ-->); scanf(%lf, &takasa);

return (0);
}

なんですか直径までうまくいくんですがそのあとEnterを押すと
デバッグエラーと出てしまいまいます。
なぜでしょうか?


引用解決済
トピックタグ
c
 c
(@c)
ゲスト
結合: 23年前
投稿: 9
 

printf(直径-->); scanf(%lf, &first.chokkei);
printf(高さ-->); scanf(%lf, &first.takasa);


返信引用
NTAKA
 NTAKA
(@NTAKA)
ゲスト
結合: 22年前
投稿: 5
 

構造体についてもう少し理解を深めた方が・・・
ちなみに、それってコンパイルできたんでしょうか?


返信引用
どたんば
 どたんば
(@どたんば)
ゲスト
結合: 22年前
投稿: 3
Topic starter  

すいません。
保存前のを載せてしまいました。
printf(直径-->); scanf(%lf, &first.chokkei);
printf(高さ-->); scanf(%lf, &first.takasa);
で実行してもだめなんですよ。


返信引用
暇人貴子
 暇人貴子
(@暇人貴子)
ゲスト
結合: 22年前
投稿: 11
 

> printf(名前-->); scanf(%s, &first.name);
も変ですね。


返信引用
どたんば
 どたんば
(@どたんば)
ゲスト
結合: 22年前
投稿: 3
Topic starter  

すいません。
具体的にどこがおかしいのでしょうか?
おねがいします。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

first.nameはたった1文字分の領域しかありません。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

>first.nameはたった1文字分の領域しかありません。

struct CPU{
char name[2];
    .
    .
    .
にしても
>printf(直径-->); scanf(%lf, &first.chokkei);
でランタイム エラー出るみたいですね
昔はコンソール上に「R6002 」なんて出たんですけど
今はWindowsがただ「ランタイム エラー」メッセージ出すだけで
エラーナンバーわかりゃしない

でも、それ+
>first.chokkei
を初期化すると
>first.takasa
を初期化しなくても
>printf(高さ-->); scanf(%lf, &first.takasa);
も通るね

どうも私も、この辺の理解度が低くて誰かフォローお願いします


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

#include <stdio.h>

struct CPU{
char name[8];
int syuuhasuu;
double chokkei;
double takasa;
};
struct CPU first;

int main(void)
{
printf(それぞれに値を入力してください。\n);
printf(名前-->); scanf(%s, first.name);    <-ここ直しました
printf(周波数-->); scanf(%d, &first.syuuhasuu);
printf(直径-->); scanf(%lf, &first.chokkei);
printf(高さ-->); scanf(%lf, &first.takasa);

return (0);
}

でエラーが出なくなりましたが???

でも、最初ソースをコピーしてRUNしたら「ランタイム エラー」が出てましたね~?


返信引用
Green
 Green
(@Green)
ゲスト
結合: 22年前
投稿: 11
 

アイススケーターさんが直してくれていますが・・・

> struct CPU{
> char name;
> int syuuhasuu;
> double chokkei;
> double takasa;
> };

この構造体だと意図通りに動いてくれないと思います。
構造体は通常各要素が4バイト境界で切れていなければなりません。
ちょっと説明が難しいのですが次のようなプログラムを動かして頂ければ
分かると思います。

#include <stdio.h>

struct CPU{
char name;
int syuuhasuu;
double chokkei;
double takasa;
};
struct CPU first;

int main(void)
{
printf(0x%X , &first.name);
printf(0x%X , &first.syuuhasuu;
printf(0x%X , &first.chokkei;);
printf(0x%X\n, &first.takasa;);

return (0);
}

このプログラムは構造体の各要素のアドレスを表示するものですが実行すると

0x0 0x4 0x8 0x10
※便宜上オフセットで書いています。

のようになります。通常nameが1バイトですから二番目のアドレスは0x1に成らなければ
いけないのですがsyuuhasuuが4バイト境界をまたがっているためこのように4バイト境界
で切れるようにnameのあとに3バイト詰め物されます。このせいで最後のtakasaにアクセ
スしようとすると構造体の領域外にアクセスしてしまいメモリ破壊を起こすこともあります。


返信引用
Green
 Green
(@Green)
ゲスト
結合: 22年前
投稿: 11
 

良く考えるとこの構造体もちょっと引っかかりますね。

> struct CPU{
> char name[8];
> int syuuhasuu;
> double chokkei;
> double takasa;
> };

この場合、chokkeiが境界に引っかかります。double型の場合8バイト区切りに収まる
ように構造体を作らなければなりません。なのでこの場合

struct CPU {
char name[8];
int syuuhasuu;
int dummy;
double chokkei;
double takasa;
};

のようにダミーの要素を追加することでこの問題を回避します。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

え?え? このコンテキストでアラインメントが影響するかしら?


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

> wood 2003/02/05(水) 05:04:44

Release 版でビルドするとエラーメッセージが出るみたいです。

runtime error R6002
- floating point not loaded

C-FAQ の 14.13 が関係ありそうです。
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/c/C-faq/C-faq-
00.html#contents


返信引用
暇人貴子
 暇人貴子
(@暇人貴子)
ゲスト
結合: 22年前
投稿: 11
 

私の環境では、単に
#include <stdio.h>

void main(void)
{
double d;
scanf(%lf, &d);
}

としても、ランタイムエラーが発生します。

WinMe, VC++6.0SP5


返信引用
Green
 Green
(@Green)
ゲスト
結合: 22年前
投稿: 11
 

> え?え? このコンテキストでアラインメントが影響するかしら?
すみません。ちょっと書き方が悪かったですね。
この場合関係ないけど気を付けたほうがいいよということで(^^;
私自身アライメント関係で昔苦労したものでこの問題について過敏になりすぎてまして。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました