char name[20]と*nameの違いがまだハッキリわかりません
sizeof()で調べたら*nameの方で実行した構造体のプログラムはname[20]で実行したのに比べてバイト数なども半分になり、アドレスの間隔も変化したので、ポインタで定義したほうが良いような感じはするのですがこんな単純な理由ではないと思います。
この2種の違いがインターネットを調べても納得いく答えがだせず、教科書にも詳しく書かれていなかったので、分かる方がおられれば教えてください。
作成中のプログラムです
#include<stdio.h>
structmdcl_chk{
//charname[20];
char*name;
intage;
floatweight;
floatheight;
};
void main(void)
{
inti,x;
structmdcl_chkMdcl_Chk[5]={
{"タカノハナ ",38,150.0,183.0},
{"ワカノハナ ",39,120.0,180.0},
{"ムサシマル ",39,237.0,192.0},
{"アサショウリュウ",30,147.0,184.0},
{"ハクホウ ",25,149.0,192.0}
},*MC,*DEF,*OFF;
MC=Mdcl_Chk;
for(i=0;i<5;i++){
printf("%s %d %5.1f %5.1f\n",( MC+i )->name,( MC+i )->age,( MC+i )->weight,( MC+i )->height);
}
printf("\n");
printf("Mdcl_Chk = %3d bite\n",sizeof(Mdcl_Chk));
printf("mdcl_chk = %3d bite\n",sizeof(mdcl_chk));
printf(" MC = %3d bite\n",sizeof(MC));
//アドレス表示
MC=Mdcl_Chk;
printf("\n");
for(i=0;i<5;i++){
printf("Mdcl_Chk[%d] adr = %08d %08X\n",i,MC+i,&Mdcl_Chk[i]);
}
}
No.1ベストアンサー
- 回答日時:
>char name[20]と*nameの違いがまだハッキリわかりません
char []は配列です。
指定されたサイズのメモリがあることは保証されます。
# 変数の寿命については考慮する必要がありますが。
char *はchar型の領域を指すポインタです。
# ポインタ変数の領域として、32BitOS上のソフトであれば一般的に4バイト必要です。
ポインタ変数は有効などこかの領域を指している必要があります。
たいていのローカル変数は初期化されていませんので、正しい領域を指しません。
掲示されている例の場合、ポインタは文字列リラテルを指しているので問題ありませんが…
文字列リラテルを指していますので、内容を書き換える事はできません。
strcpy(Mdcl_Chk[1].name, "ホクトウミ");
というようなコトはできません。
# 代わりに Mdcl_Chk[1].name = "ホクトウミ"; は可能。
# C言語の文字列処理の経験が浅いと、こっちの方が便利に見えるかも知れませんけどね…。
掲示の場合は変数宣言時に初期値が設定されているので問題ありませんが…
配列Mdcl_Chkが未初期化の場合に外部からデータを読み込む時に問題になるでしょう。
char name[20];
の場合は、文字列終端の'\0'込みで20バイト確保されています。
char *name;
の場合は動的メモリ確保(malloc()など)で正しい場所を指すようにしないとアクセス違反になります。
# 動的確保したら不要になった時点で自分で開放する必要があります。
# 動的確保の為、確保できるメモリ容量以外に文字数を制限する要素はありません。
# 勿論、メモリ確保に失敗する可能性も考慮する必要がありますが。
>この2種の違いがインターネットを調べても納得いく答えがだせず
どう納得ができない…のでしょう?
構造体に固執するばかりにポインタの領域などの内部の知識が疎かになっていました。
納得ができないと言うのか構造体で使われる配列とポインタの違いばかり考えていたので基礎の配列とポインタの役割の違いが頭から抜けていました。
今回のみなさんの回答でスッキリしました。ありがとうございます
No.3
- 回答日時:
char[20]だとこんな感じ
name:□□□□□□□□□□□□□□□□□□□□
age:????
weight:?.??
height:?.??
char*だとこんな感じ
name: →???
age:????
weight:?.??
height:?.??
初期化後の状態は
char[20]だとこんな感じ
Mdcl_Chk[0].name:タカノハナ'\0'□□□□□□□□□□□□□□
Mdcl_Chk[1].name:ワカノハナ'\0'□□□□□□□□□□□□□□
Mdcl_Chk[2].name:ムサシマル'\0'□□□□□□□□□□□□□□
....
(文字コードによっては、仮名一文字あたり何マス使うかが変化します)
char*だとこんな感じ
どこかの領域No1:タカノハナ'\0'
どこかの領域No2:ワカノハナ'\0'
どこかの領域No3:ムサシマル'\0'
....
Mdcl_Chk[0].name:→どこかの領域No1
Mdcl_Chk[1].name:→どこかの領域No2
Mdcl_Chk[2].name:→どこかの領域No3
....
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
reallocについて
-
allocってなんですか?
-
プログラムが途中で強制終了し...
-
C++で、メンバもヒープに確保さ...
-
構造体でchar name[]と*nameの...
-
LPTSTR型の変数に文字を格納
-
座標値を読み込んである領域に...
-
16進ダンプのプログラム
-
malloc呼び出し時のセグメンテ...
-
c言語のポインタへの文字列入力...
-
構造体へのポインタの動的確保...
-
C言語 配列の長さの上限
-
関数から配列を返すには?
-
C言語のポインタに直接アドレス...
-
VBAのプログラムで、DIAG = 1# ...
-
「#undef」と「#define」の使い...
-
Integer変数をカラにしたいので...
-
構造体のextern方法
-
セグメントエラー
-
CStringからchar*への型変換に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
newしないオブジェクトについて
-
allocってなんですか?
-
malloc呼び出し時のセグメンテ...
-
ヒープメモリの解放について
-
配列の添え字の最大数とは?
-
C++で、メンバもヒープに確保さ...
-
ビットをローテートするプログ...
-
プログラムが途中で強制終了し...
-
構造体でchar name[]と*nameの...
-
stringの最大サイズ
-
C言語 mallocとfreeについて
-
mallocで確保するメモリの領域...
-
void*型のデータサイズ
-
大容量の静的な確保の限界値
-
DLLのマルチスレッドの動作につ...
-
スタック破壊の上手な見つけ方...
-
C++のnewで確保したメモリーの...
-
行列内の行の交換,列の交換を...
-
LPTSTR型の変数に文字を格納
おすすめ情報