動的に確保されたメモリに文字列データを格納するには🌞必ず🌞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関数を用いることになります
てへぺろ」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます