こんな子いるかな? char* p;を実行した後 p[0],p[1],p[2]を用いて文字列データをメモリに格納することはできません

Visual Studio 2018では ポインタ変数を使って文字列データをメモリに格納することができますが 


Visual Studio 2019では ポインタ変数を使って文字列データをメモリに格納することはできません






ソーラー「なんと


            配列を使って文字列データをメモリに


格納する方法以外に


           ポインタ変数を使って文字列データをメモリに



格納する方法があるんだね



ポインタ変数を使って文字列データをメモリに



格納する方法はこちらです

👇


#include <stdio.h>


int main(void) {


char* p ="abc";


printf("%c\n", p[0]);

printf("%c\n", p[1]);

printf("%c\n", p[2]);

printf("%c\n", p[3]);

printf("%s\n", p);

printf("%p\n", p);

return 0;


}


ビルド実行結果

a

b

c

(空白となります)

abc

002E7B30



ソーラー「ポインタ変数を使って


文字列データ"abc"をメモリに


格納するとき


メモリに格納された文字データ


'a'

'b'

'c'

'\0'


p[0]

p[1]

p[2]

p[3]

をもちいてあらわすことができました


それならば


char* p;


を実行して


p[0]='a';

p[1]='b';

p[2]='c';

p[3]='\0';

を実行することにより


文字データ


'a'

'b'

'c'

'\0'

をメモリに格納できるのではないか?


と思われる方がおられるかもしれません


ですがそのようなことはできません


そのことを示すプログラムはこちらです

👇

#include <stdio.h>


int main(void) {


char* p ;


p[0]='a';

p[1]='b';

p[2]='c';

p[3]='\0';

printf("%c\n", p[0]);

printf("%c\n", p[1]);

printf("%c\n", p[2]);

printf("%c\n", p[3]);

printf("%s\n", p);

printf("%p\n", p);

return 0;


}


コンパイル結果(EAZY IDECの場合)


続行するには何かキーを押して下さい. . .




Visual Studioの場合


ビルド実行結果


エラー C4700 初期化されていないローカル変数 'p' が使用されます





ソーラー「EAZY IDECを用いて


プログラムを実行した場合


コマンドプロンプト画面に何も表示されていませんね



Visual Studioを用いて


プログラムを実行した場合


エラー C4700 初期化されていないローカル変数 'p' が使用されます


が表示されます




char* p;


を実行して


p[0]='a';

p[1]='b';

p[2]='c';

p[3]='\0';

を実行することにより


文字データ


'a'

'b'

'c'

'\0'

をメモリに格納することはできないのですね



なぜ  このようなことがおきるのか?


それは


            🍋char* p;🍋


を実行しただけでは


ポインタ変数は初期化されず


ポインタ変数pにはアドレスは代入されません


ポインタ変数pにアドレスが代入されないとなると


pに[]演算子を用いた


p[0]

p[1]

p[2]

p[3]



どのアドレスのメモリにアクセスしたらいい変数なのか


定まらないということになります


どのアドレスのメモリにアクセスしたらいい変数なのか


定まらない

p[0]

p[1]

p[2]

p[3]

には


p[0]='a';

p[1]='b';

p[2]='c';

p[3]='\0';


のようにデータが代入できないというわけです



それに対し



            char p[4];


のように


       pの配列宣言を実行し


配列変数


p[0]

p[1]

p[2]

p[3]


を生成した場合は



p[0]='a';

p[1]='b';

p[2]='c';

p[3]='\0';


を実行して


文字データ


'a'

'b'

'c'

'\0'



メモリに

格納することができます



            char p[4];


を実行したときは


それだけで


ポインタ変数pにある定まったアドレスが代入されているので


配列変数


p[0]

p[1]

p[2]

p[3]



どのアドレスのメモリにアクセスしたらいい変数なのか


定まることになります


ですので


p[0]='a';

p[1]='b';

p[2]='c';

p[3]='\0';


が実行できるのですね


(実際には


char* p="abc" ;


char p[4];

p[0]='a';

p[1]='b';

p[2]='c';

p[3]='\0';

の仕組みはことなっています


後ほど その例をご説明いたしますね(^_^)/」


その時のプログラムはこちらです

👇

#include <stdio.h>


int main(void) {


char p[4];

p[0] = 'a';

p[1] = 'b';

p[2] = 'c';

p[3] = '\0';



printf("%c\n", p[0]);

printf("%c\n", p[1]);

printf("%c\n", p[2]);

printf("%c\n", p[3]);

printf("%s\n", p);

printf("%p\n", p);

return 0;


}


ビルド実行結果


a

b

c

(空白となっています)

abc

006FFEA0



ソーラー「


ポインタ変数を使って



          💖char* p = "abc";💖


を実行して


文字列データ"abc"をメモリに格納した場合は



          💖ポインタ変数pに💖


💖文字列データ"abc"を格納しているメモリ領域の先頭のメモリのアドレスが💖


          💖代入されます💖   


p[0]

p[1]

p[2]

p[3]


はどのメモリにアクセスしていいかわかることになります


ですので



p[0] = 'a';

p[1] = 'b';

p[2] = 'c';

p[3] = '\0';


を実行することができ


p[0]

p[1]

p[2]

p[3]

を用いて

printf("%c\n", p[0]);

printf("%c\n", p[1]);

printf("%c\n", p[2]);

printf("%c\n", p[3]);


を実行し


文字データ


'a'

'b'

'c'

'\0'


を格納したメモリ

にアクセスし


コマンドプロンプト画面に


a

b

c

(空白)

を表示することができます


           ですが


さらに


p[0]

p[1]

p[2]

p[3]

を用いて



p[0] = 'd';

p[1] = 'e';

p[2] = 'f';

p[3]='\0';

を実行して


文字データ


'd'

'e'

'f'

'\0'


メモリに格納することはできません


そのことを示すプログラムは次のようになります

👇

#include <stdio.h>


int main(void) {


char* p = "abc";


printf("%c\n", p[0]);

printf("%c\n", p[1]);

printf("%c\n", p[2]);

printf("%c\n", p[3]);

printf("%s\n", p);

printf("%p\n", p);




p[0] = 'd';

p[1] = 'e';

p[2] = 'f';

p[3] = '\0';


printf("%c\n", p[0]);

printf("%c\n", p[1]);

printf("%c\n", p[2]);

printf("%c\n", p[3]);

printf("%s\n", p);

printf("%p\n", p);

return 0;


}


ビルド実行結果


a

b

c

abc

(空白です)

00917B30

続行するには何かキーを押して下さい . . .


アレサ「


a

b

c

abc

(空白です)

00917B30

までは


直ぐに実行結果が表示されるのですが




続行するには何かキーを押して下さい . . .



が表示されるまで


大分時間がかかっています


p[0] = 'd';

p[1] = 'e';

p[2] = 'f';

p[3]='\0';



printf("%c\n", p[0]);

printf("%c\n", p[1]);

printf("%c\n", p[2]);

printf("%c\n", p[3]);

printf("%s\n", p);

printf("%p\n", p);

は実行されていないので何も表示されません」


ソーラー「


char* p = "abc";


を実行して


ポインタ変数pには


💖文字列データ"abc"を格納しているメモリ領域の先頭のメモリのアドレスが💖


          💖代入されて💖   



p[0]

p[1]

p[2]

p[3]

がアクセスするメモリが定まっているのに


p[0] = 'd';

p[1] = 'e';

p[2] = 'f';

p[3]='\0';

が実行できないなんて


おっかしいなあ😊


なんでこんな仕組みになっているんだろう?」









  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る