
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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
入れ子になった構造体について
-
Win32APIでのメモリ管理について
-
DLLで同じメモリ領域を参照する...
-
reallocの断片化対策について
-
構造体でchar name[]と*nameの...
-
realloc関数でメモリエラー
-
allocってなんですか?
-
malloc使用後のメモリアロケー...
-
malloc呼び出し時のセグメンテ...
-
プログラムが途中で強制終了し...
-
セグメンテーション違反とmalloc
-
newと配列?
-
new と malloc によるメモリの...
-
stringの最大サイズ
-
HEAP に関すること
-
C++のnewで確保したメモリーの...
-
newしないオブジェクトについて
-
グローバル変数のサイズ
-
CreateFileMapping について
-
C言語のポインタに直接アドレス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
allocってなんですか?
-
c言語のポインタへの文字列入力...
-
newしないオブジェクトについて
-
void*型のデータサイズ
-
C++のnewで確保したメモリーの...
-
スタック破壊の上手な見つけ方...
-
グローバル変数のサイズ
-
C++で、メンバもヒープに確保さ...
-
ヒープメモリの解放について
-
大容量の静的な確保の限界値
-
malloc呼び出し時のセグメンテ...
-
プログラムが途中で強制終了し...
-
配列の添え字の最大数とは?
-
stringの最大サイズ
-
free関数で動作が止まる
-
HEAP に関すること
-
bool と BOOL の違い(構造体)
-
mallocで確保するメモリの領域...
-
Accessで、メモリを開放するタ...
-
C言語で作ったゲームがフリーズ...
おすすめ情報