動的に確保されたメモリに文字列データを格納するには🌞必ず🌞strcpy関数を用いる必要があります

動的に確保されたメモリに文字列データを格納するには🌞必ず🌞strcpy関数を用いる必要があります



動的に確保されたメモリに


文字列データを格納するには


          🌞必ず🌞


        

        🌞strcpy関数を用いる🌞



ということを知っておく必要があります


次のプログラムをご覧ください

👇

#include <iostream>


using namespace std;


int main() {


char* a;


a = new char[50];


strcpy_s(a, 50, "neko");


cout << a << "\n";

}



プログラムの実行結果


neko


マックス「これは!


strcpy_s関数か!


ってな


何の関数だったけか?」


ソーラー「このプログラムでは



a = new char[50];


が実行されています


a = new char[50];


が実行されると


文字列データを格納することのできる


1バイトかける50個分のメモリが確保されます


そして確保されたメモリの先頭のアドレスがポインタ変数aに格納されることになります



ポインタ変数aを用いて動的に確保したメモリ iに


strcpy_s関数を用いて


文字列データ"neko"


を格納しています


strcpy_s(a, 50, "neko");



その命令文ですね


strcpy_s関数を用いて


動的に確保したメモリに


文字列データを


格納するには



strcpy_s関数の第1引数には


動的に確保したメモリの先頭のアドレスを格納している


ポインタ変数を


strcpy_s関数の第2引数には


動的に確保したメモリに何バイトまでのデータなら


書き込んでもいいかを示す数値を


strcpy_s関数の第3引数には


動的に確保したメモリに格納したい文字列データを記述します


strcpy_s(a, 50, "neko");


が実行されると


ポインタ変数aを用いて動的に確保したメモリに


文字列データ"neko"


が格納されます


第2引数の50は


50バイトまでの文字列データなら


ポインタ変数aを用いて動的に確保したメモリに


格納されるようにするために記述されています


もし


第3引数に51バイトの文字列データを記述すると


strcpy_s関数は実行されずビルドエラーが表示されることになります




マックス「ふっふっふ・・・


strcpy_s(a, 50, "neko");


を実行して


文字列データ"neko"を


a = new char[50];


を実行して


動的に確保したメモリに格納しなくても


a="neko";


を実行すれば


文字列データ"neko"を


動的に確保したメモリに格納できるんじゃないか?」


ソーラー「ふっふっ


つまり


今のプログラムの


strcpy_s(a, 50, "neko");


の部分を


a="neko";


と記述しても


a = new char[50];


を実行して


動的に確保したメモリに


文字列データ"neko"を格納することができる。。。ということですか?

(👆嘘です)



c言語の改訂により


a="neko";


は実行することはできなくなりました



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

👇

#include <iostream>


using namespace std;


int main() {


char* a;


a = new char[50];


a="neko";


cout << a << "\n";

}



プログラムの実行結果


neko


マックス「


ちゃんと


ポインタ変数aを用いて文字列データ"neko"がメモリに


格納されているじゃないか


だから


cout << a << "\n";


のプログラムの実行結果として


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


neko


が表示されているんじゃないか?」


ソーラー「確かに


文字列データ"neko"はメモリに格納されていますが


a = new char[50];


を実行して


動的に確保されたメモリに


文字列データ"neko"が


格納されたのではなく


a = new char[50];


を実行して


動的に確保されたメモリとは


全く別のメモリに


文字列データ"neko"は


格納されています


cout << a << "\n";


が実行されると


そのメモリに格納された


文字列データ"neko"が


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


neko


として表示されることになります」


マックス「・・・・😊・


なんと そうなるのか?」


ソーラー「


a = new char[50];


が実行されると


ポインタ変数aには


new char[50]


が実行されることにより


動的に確保されたメモリの先頭のアドレスが格納されます


次に


a="neko";


が実行されると


動的に確保されたメモリとは


別の


あるメモリに文字列データ"neko"が格納されることになりますが


そのメモリの先頭のアドレスを


ポインタ変数aは格納することになります


ですので


cout << a << "\n";


が実行されると


ポインタ変数aが格納しているアドレスの


メモリに


格納されている文字列データ"neko"が


コマンドプロンプト画面に表示されることになります


つまり


a = new char[50];


a="neko";


が実行されても


文字列データ"neko"は


動的に確保されたメモリに格納されるということはないわけです


実は


a = new char[50];


を実行して


動的に確保されたメモリに


文字列データ"neko"を格納するには


strcpy_s関数を用いることになります


てへぺろ」



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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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