[音楽再生] DAVID J.マラン:すべての権利、これはCS50です これは週5の始まりです。 だから、今日、あなたのシートクッションの下に、 あなたは何を見つけることができません。 しかし、上記の、あなたは、これらを見つける必要があります 私たちの感謝の少しトークン あなたが入れた仕事のすべて フィフティーンのゲームに。 単純に少し円を削除する ために再生を開始するためのボトム クラスの残りの部分。 だからを思い出す、または設定した問題を知っている この週末に出か​​けた4、 別のゲームを書くことが含まれます。 それは使用することを含むが、今回 実際のグラフィカル·ユーザー·インターフェースではなく、 のようなテキストインターフェース フィフティーンのゲームだった。 あなたの前に位置しており、ゲーム、 あなたは、まだこの次を見ていないした場合、 このような小さなものが見えます。 私はターミナルに行くつもりです ここでGDBの窓。 そして、私は先に行くと実行するつもりだ あなたがアクセスできるスタッフソリューション、 いつものようにアップデート50を実行した後。 しかし、私は少しにそれを置くつもりです シークレットモードでは、少しイースターエッグ、 によって、神モード、いわゆる argv1で神を置く。 そして、私は自分の指示に従わなければならない、 私自身でそれを実行している 問題は、ディレクトリを設定します。 だから今は、完全なバージョンを参照してください ブレイクアウトのゲームの。 実際には、これは非手モードである。 だから、実際にだ - でも沸かせてかもしれない - で神のモードを実装するのはかなり些細 ブレイクアウト、フィフティーンのゲームとは異なり、 そのあなたのいくつかは、取り組んでたかもしれない ハッカーエディションの。 ブレイクアウトでは、神に十分である モードは単純に、何を行うには 直感的にパドルを持つ? ただ、何にそれを等しくする 水平位置はボールである。 そして限り、あなたはロックステップでこれを行うように このゲームを移動するボールが意志を持つ 、これまで、これまでに、ボールを見逃すことはありません そして、あなたは毎回勝つ。 しかし、今週のハッカー版で ただ神モードよりはあり。 他の機能の数があります。 中でも、レーザー。 だから、あなたが本当にせっかち得れば レンガを撃墜起動することができます といくつかの他。 としたいのです人のために 標準対ハッカーを校正 版は、私が見ることができ、今週の ハッカー版は意図的である 神よりも、言って、もう少しなんとか モードは、フィフティーンのゲームであった。 あなたはストレッチを探しているのであればと あなたには、いくつかの付加的な楽しみのために探している 特徴は、関心のある場合でのダイビングを行う。 今より実用的に、私が指摘してみましょう 外に一つのことだけでなく。 GDB、あなたのいくつかは、まだしていない可能性があり 罰金である、個人的に触れた。 しかし、今は本当に慣れるための時間です このツールを使ってこれで快適に それはあなたの生活を行いますので はるかに簡単に、本当に。 GDBでロブの講演カップルパー 週間前に、リコール そのGDBデバッガです。 それはあなたを実行できるようにするツールだ プログラムが、それはステップ、ラインバイステップで実行 線で、あなたの周り突くことができるように、 ので、物事が起こって表示されるので、 あなたは、プリントアウトすることができます 変数の値。 要するに、それはあなたにそんなに多くを提供します printDefより力がありません。 今確かに、インタフェース かなり難解です。 黒と白のテキストインターフェース ほとんどの部分。 コマンドはやや厳しいです 最初に覚えておくべき。 しかし、それはあなたの半分を取る場合でも 時間、時間、その先行を配置する そこに時間の投資は、私を信頼しています。 確かに学期の終わりまでに、それは保存されます あなたより一桁 それよりも時間。 インチ週間のダイビングでとても早い とブレイクアウトの観点から、あなたのことを知っている あなたが持っている限り、これを行うことができます 流通コードや独自のコード あなたのPst4ディレクトリ内の進行である。 あなたは、GDBを実行することができることを知っている。/ブレイクアウト。 これは、開くために起こっている このようなウィンドウが表示されます。 私はもっ​​と自分自身を挙げてみましょう ターミナルウィンドウの。 そして、私が先に行くつもりです何 とやる、それだけでそれを実行していない。 私が最初にブレークポイントを設定するつもりだ 一時停止をすることができますリコール、 特定の場所で実行。 ちょうど私が行くよ物事をシンプルに保つために だけ入力して、行1で破る ナンバーワン。 私は実際にこのウィンドウを再度開きましょう それはなってきたので、 そこに少し小さい。 それでは、私は今ここで行うつもりであることは 私はターミナルウィンドウを開く場合。 そこに我々が行って、さあ。 だから今、私はDropboxの、Pst4に戻った場合 とGDBを実行します。/ブレイクアウトは、次のコマンドを入力します気付く 私が設定するために、1つを破るつもりだ 行1にブレークポイント。 そして今、私は行くつもりです 先に、実行を入力します。 そして、私が行うとき、何も気づかない 起こるようです。 ないポップアップはありません。 グラフィカルなはありません まだユーザーインターフェース。 私はだからしかし、それは理解できるだ 文字通りラインで私のプログラムの1つの。 そして、私は早送りしたことに気づく 特に今62に、すべての理由 このファイルの先頭にあるものがある コメントや定数のようなものと 今のものを面白くない。 だから今、私は、メインの内側だ それは、ライン62で、と思われる。 そして、これは単にディストリビューションです コー​​ド、リコール。 私は、同様に、行くことによってこれまでを開く場合 Pst4に私のドロップボックスディレクトリに、 breakout.cに。 そして、私は下にスクロールしてダウンしてダウンしている場合は、 と私は先に行くと、オンにせ 私の行番号。 私はダウンにスクロールすると、私は、何が表示されます ライン62は、まさに行であることを 我々はに一時停止しました。 この行は、ここで、62になるように 我々がしようとしているところ。 だから今GDBで、私が先に行くとタイプする場合 今次、それが起こっている入力 その行を実行します。 と出来上がり、我々は持っている グラムウィンドウいわゆる。 何GWindowに不慣れであれば 心配しないように、です。 スペックは次のように、それを紹介します よくチュートリアルビデオの数など スペックに包埋した。 しかし、今この作ってみましょう もう少し面白い。 私は、このウィンドウ上を移動しましょう 側へ少し。 私は窓を少し作ってみよう 大きなので、私はより多くを見ることができます。 そして今、私は先に行かせて そして再び次やる。 そして、私のレンガがあります。 私は再び次の入力した場合 今私は、ボールを参照してください。 そして、私は再び次を入力した場合 今私はパドルを参照してください。 そして、幸いにもこのgeditのではありません 本当に私を示すことによって、協力 私が望むすべて。 しかし、今、私は再び次の行う場合、 次再び、私はちょうどよ いくつかの変数を宣言する。 そして、私はいずれかを印刷することができます 外にこれらの人の。 プリントレンガ、版画に住んでいます。 そして今、私は続けてやっていくと 次、私はだろうことに気付く そのループの内側。 しかし、コードが実行されるために起こっている まさに私が期待どおり。 だから私はこの機能を打ったとき、待って クリックのために、それを行うために起こっている それは文字通りその。 だから私はコントロールを失っているように見えた プログラム上。 GDBは私に別のプロンプトを与えていません。 しかし、心配しない。 私のゲームに移動し、どこかをクリックします。 と出来上がりには、今ではライン86へ進む。 だから、再び、それは最終的に、非常に貴重だし、 問題をデバッグするための。 あなたは、文字通りステップスルーできますので コー​​ド、アウトとはるかにプリントもの、 ずっと、もっと。 独りしかし今のところ、これらのツール かなり遠くにあなたを取得する必要があります。 だから私たちは、もちろん、外観を取っている 今のグラフィックで、突然。 そして今、私たちの世界は少しを取得 もっと面白い。 そして、あなたはいくつかのから、多分、知っている 我々はこれらを持っていることをオンラインビデオ あなたが見てきたこと短パン 問題セットの一部として。 そして、彼らは、意図的に、撮影してきた 白の背景に。 そのうちのいくつかは、教育を持っている 上のいくつかのテキストを描画するフェロー オーバーレイの画面 それらの側面にある。 もちろん、これはすべてのことはありません 現実の世界で興味深い。 これはただで講堂です 大きな白い画面と背景。 そして、私たちの素晴らしい制作チームのソート すべてが美しく見えるの 外トリミングによって事後 または何かをオーバーレイ 私たちは何かしたくない。 今ちょうど今週やる気にさせると 本当に、あなたが行くことができるところ、最終的には、 コンピュータサイエンスと。 だけではなく、問題が発生した後4を設定します。 しかし、後に別のコースや全体 カリキュラム、それは何をすることができます驚くべきことだ の観点から、これらの日を行う 特にグラフィック。 皆さんの中にはこれを見たかもしれない オンラインの周りを流れる。 しかし、私はちょうどのために、私はあなたが表示しようと思いました 数分、何かを垣間見る コンピュータ技術とどのようなCGI、 コンピュータグラフィックスは、これらの日を行うことができ おなじみの歌で そしておそらく映画。 [MUSIC - LANA DEL RAY、 "若くて美しい] SPEAKER 1:それはほんの少しだ 驚くべきは、おそらく、どれだけ 遍在する - [拍手] SPEAKER 1:私はちょうどそれをダウンロード。 しかし、それはただ、私が思うに、本当に驚くべきことだ 遍在するソフトウェアコードと方法 このようなツールは、実際にある。 だから方向の味だ ているあなたは行くことができます。 ああ、これ以上のアプライアンス今日。 まあ、それは実際に悲劇的なタイミングだ ポイント与えられた私はちょうど作ってみました。 すべての権利、それでは起動してみましょう 再び融合。 後で私に思い出させる。 大丈夫、あなたが持っているはず あなたが取得しなかった場合はさておきとして、電子メール そのように気付く。 すべての権利、その結果先週リコール 我々は戻って皮これに開始 後で文字列として知られている。 文字列ですデータ型をリコール CS50ライブラリで宣言された。 そしてそれは補助輪の一部だ それは現在、離陸を開始します。 それは早い段階で有用な概念であった。 しかし、今、それは多くを得るために起こっている 興味深く、より強力な 実際には、フードの下のことを参照してください 文字列はただ何か、我々は言ったのですか? ええ、そう、それは、いわゆるchar *型です。 そして、そこに*がありことを示し アドレスのいくつかの種類が関係する。 そしてあなたは、char *を言うときあなただけ意味 データ型がある変数 今ポインタ。 そこに星があるという事実 ちょうどあなたが宣言されていることを意味 ポインタいわゆる。 そして、そのポインタが明らかに起こっている アドレスの、のを保存 もちろん、イワナ。 今、なぜこれが意味をなさない? さて、何が文字列である ボンネットの下に? まあ、我々が言ってきたいくつかの時間のために ボンネットの下に文字列があることを ただ、H-E-L-L-O、例えば。 しかし、我々はこのようにについて説明しました 、本質的に、配列されて。 と配列はその後少しなり これらの各々は、このような多くの 一口を取って。 そして、我々はそこだと言ってきた ここに戻って何か特別なもの、 バックスラッシュ0、またはnullターミネータ。 ここだからすべてのこの時間、この 文字列となっています。 しかし、実際には、文字列です 実際にアドレス。 そして我々が見るようにアドレスは、しばしば 慣例により0Xで始まる。 0Xは何を意味するのでしょうか? 誰でも知っていますか? だからそれだけで進を意味します。 だから、pstファイルから、実際に、思い出すかもしれません 1、私は信じて、ウォームアップの一つ 実際に約ある質問 に加えて進表記 バイナリと小数。 そしてここで動機はつまり 進数では16を持って あなたの処分での数字。 続い0、1、2、3、4、5、6、7、8、9、 A、B、C、D、E、Fによる。 そして、あなたはそれらのすべての最高を数えた場合、 あなたは16の合計を取得します。 だから、これはとは対照的である 我々は10を持っている10進数、 数字、9 0〜。 これは、バイナリとは対照的だ 我々だけで0と1を持っているところ。 しかし、あなただけのことができ、一日の終わりに 同じ数字を表しますが、 多少異なる。 と16進数が一般的であるようなので、 それが判明した - そして、我々はこれを表示されます 後でコースで - さえ我々は得るとき のコンテキストでWebプログラミングへ HTMLおよびカラーコード、 進はいいです。 各桁なので、判明 完全に4ビットを表します。 きれいにラインのだからそれだけで一種 として我々は、最終的に表示されます。 だから、これはOx123か何かかもしれない 示すアドレス123、そのような どこかの中に私の コンピュータのメモリ。 もちろん、いくつかの問題が生じる このため、基礎となるの 実装。 そして、私はで刺しを取ったことを思い出してください このような機能を実現 - 先週ダッシュ0点Cを比較し、その それがあったようにそれが見えていても 右、それは単に比較しませんでした 二つの文字列を正しく。 私は離れてメイン投げてきたが、私が投げてきた 離れてのコメントは、ちょうど上に集中する ここで興味深いのコード。 それはバグだから、それは赤でだ。 どのような理由のために? まあ、そこに一番上に私は宣言したとき 本当に何が起こっていたか文字列、 ボンネットの下に? まあ、私が上に行こう ここで画面のことを描く。 だから私は、再び、宣言 文字列s GetStringメソッド。 だから私は今、先に行くつもりだと それが本当に何のためにSを描く。 それはここで、正方形になるだろう。 と私は主張するつもりだ それが32ビットだ。 少なくともそれは通常、 少なくともCS50で コンピュータの多くでアプライアンス。 私はそれの呼ぶつもりです。 しかし、今我々思い出す GetStringメソッドと呼ばれる。 だからGetStringメソッドを返し、 もちろん、文字列。 H-E-L-L-Oにおけるユーザタイプが入力した場合 文字列は、こんにちは返されます。 その文字列は、先ほど言ったように、終了 までどこかに、コンピュータのメモリ内 最後にバックスラッシュ0と。 私は、配列のようにこれを描くよ - または 文字の連続した​​ブロック - それは実際にあること。 そして今、getStringをされているもの 実際に戻って? 何が戻ってきましたGetStringメソッド この時間のすべて? さて、私たちは、前の週には、言う それは、文字列を返します。 しかし、もっと技術的には、何をし 明らかにリターンをGetStringメソッド? 読者:アドレス。 SPEAKER 1:アドレス。 具体的には、のアドレスを返します それが何であれ、非常に最初の一口、。 ただ一つ、二つ、三つを使用し続ける それは便利だから。 これは、最初のアドレスを返します 文字列内の文字。 そして、私たちは先週言った それは十分である。 我々は常に把握することができますので、どこ 文字列の末尾だけで 用で、多分、それを反復する ループまたはwhileループか何かのような つまり、単に "スラッシュ0"を探して、 特殊センチネル文字。 そして、我々は知っている文字列 長さであることを起こる - このケースでは - 5。 だから技術的にGetStringメソッドが何をするか それは、この場合にOx123を返しています。 そして技術的にその後何が起こるかです ことを私たちは、Sの中、Ox123を格納します。 一日の終わりには、たとえこの 新しいコンセプトは、ポインタである、彼らがしている ただ変数。 しかし、彼らはビットを格納しているために起こる 総称してアドレスを表しています。 だから技術的にすべてのそれらを取得します Sに保存されていることOx123です。 人間としてではなく、我々 - - 今日以降含む 実際、一般的に、気にするつもりはありません 実際のアドレスは何ですか メモリのいくつかのチャンクの。 それだけに細部の低レベルにだ 知的に興味深いものになる。 だから私はこれを元に戻すつもりです。 その代わりに、より高いレベル、ただ言う 我々は、ポインタの話をしているとき 私はちょうどより多くを描くつもりだ 伝えてユーザーフレンドリーな矢印 離れて同じアイデアと抄録 実際何の細目 基本的なアドレスです。 我々はコードに戻って今ならば、どのような 我々は文字列tを持っている場合は、最後の週に起こった GetStringメソッドに等しい? こんにちはでまあ、私は再び場合、タイプ 私が手にするつもりだ、この時間 メモリの別のチャンク。 H-E-L-L-Oバックスラッシュ0。 しかし、私はGetStringメソッドと呼ばれるので、 二回目 - と私は見てからこれを知っている GetStringメソッドのソースコード - さえ それがこんにちはだった偶然だけれども 二回で入力し、GetStringメソッドではありません 最適化しようとするつもり と賢いこと。 それはちょうど別のチャンクを取得するために起こっている あるコンピュータからメモリ 別のアドレスにするつもり。 任意にだけ456を言ってみましょう。 そしてそれは何を返すために起こっている? それは456を返すように起こっている とtに保管してください。 だから何が本当にに、起こっている 左側は、私は別のチャンクを持っている メモリの、一般的に32ビット。 そしてそこにOx456に行く予定です​​。 しかし、再び、私はこれらに興味がないんだけど もはや特定の数字。 私はただ抽象的にするつもりです 矢印としてそれを描く。 だから、これは今、新しい説明です。 しかし、それはだまったく同じ考えだ すべてのこの時間を起きて。 そして理由は、次に、この最初の 比較のバージョンはバグだった 先週はなぜですか? sが等しい等しい場合は、実行すると あなたが本当に何であるT フードは比較の下に? あなたがアドレスを比較している。 そして、ちょうど直感的に、はっきりと、Ox123 等しいOx456するつもりはない。 これらの数字は、これらのビット ただ異なっている。 そして一貫して、先週、それは言った あなたもあれば、異なるものを入力 言葉はそのまま同じであった。 だから我々は、これを修正。 素人の面では、修正は何でしたか? 読者:関数を使用します。 SPEAKER 1:関数を使用します。 または星が間違いなく関与している、 しかし、何をするための関数を使用するのか? 読者:文字列を比較する。 SPEAKER 1:文字列を比較する。 だからここに根本的な問題があった 私はちょうど検討していたことを によって定義される文字列の品質 そのアドレスの比較。 そして、明らかに、それはかつて今ちょうどダムだ あなたは、何が起こっているか理解する ボンネットの下に。 本当に見て文字列を比較する場合 彼らは人間のように等しいだ 等しくなるように2つの文字列を検討する 我々はのためにそれらの文字を比較する必要が 文字の文字。 今、私は行って可能性がある この非常にうんざりするほど。 しかし親しく、私たちはしている forループを使用。 そして、ちょうどSブラケットを比較 Tブラケット私に対して私。 Tブラケットに対してSブラケットiのプラス1 iのプラス1など、内部 ループのいくつかの種類。 そして、私はその任意の2文字を見つけた場合 異なる、または私はoohのことを認識した場合、sがある tよりtより短いか長い 私はすぐに偽と言うことができ、 それらは同じじゃない。 しかし、私はsとtを介して取得し、言うなら と同じ、同じ、同じ、同じ、同じ、終わり 両方の文字列は、私が言うことができる 本当、彼らは等しくなります。 まあ、ありがたいことに、数年前に誰か 私たちのためにそのコードを書いた。 そして、彼らはそれStrComp関数と呼ばれる 文字列を比較します。 そして、それは少しカウンタのにもかかわらず それらの場合、直感的、StrComp関数は0を返します 二つの文字列、s及びtは同じである。 しかし、それは負の値を返した場合の またはtアルファベットの前に来る必要があります それは来るべきか正の値 Tアルファベットの後。 だから、あなたがこれまでに何かをソートする場合、 それは、StrComp関数が有用であることが判明。 それだけで言っていませんので、 yesまたはno、等しいかどうか。 それはあなたの順序の感覚を与える 辞書威力が好きです。 だからStrComp関数、Sコンマtが等しい が0に等しい 文字列は本当に等しい。 誰でも、この関数を書いたので、 数年前、おそらくループに使用 そのようなまたはwhileループか何か 再び文字を超える統合する と何度も何度も。 しかし、問題の二人はここで起こりました。 これはcopy0.cだった。 と赤の2つのです それは欠陥だから。 そして、我々はここで何をしましたか? さて、最初に私がGetStringメソッドと呼ばれる。 と私は、s内の戻り値を格納されている。 だからほとんど同じだ 画像のこの上部。 しかし、何がそれの後に来る? まあ、私が先に行くと取り除くう これの全体の束の。 我々はどこに私たちだけの時間に巻き戻します 現在と一致するのを持っている そこに1を並べる。 私がチェックします。 sが等しい場合は0に等しい。 さて、クイックサイドノート、時 GetStringメソッドは0を返すことがあります? 十分なメモリがありません。 右? それは、これが起こるために起こっていることはまれです 確かのコンピュータ上 またはメガバイトの数百を持って RAMのさえギグ。 しかし、それは、理論的には、返すことができます 特に場合は0、 ユーザーが協力しない。 あなたがいないようなふりをする方法があります 入力された何とトリック 復帰にGetStringメソッド 効果的に0。 だから、それをチェックするために起こっている。 あなたがたのうちに開始している場合があるため 、既に、セグメンテーションフォルトを得る - これは、おそらく源となっている いくつかの不満 - それらはほとんどの結果である メモリ関連のエラー。 どういうわけかあなたがに関してめちゃくちゃ あなたは気づいていなかった場合であってもポインタ、 ポインタがありました。 だから、セグメンテーションを誘発したかもしれない 使用して週1早けれ障害 ループまたはしばらくの間のようなもの 行き過ぎによって、ループと配列 いくつかの配列の境界、過去 あなたは、で週2で、宣言 特に。 あなたも、問題でそれを行っているかもしれない ブレイクアウトを持つ4つを設定します。 あなたはおそらく見ていないにもかかわらず、 の配布コード内の任意の星 ブレイクアウト、それはそれらのGRectことが判明 とGOvalおよび他のそのようなもの、 それらは実際にはポインタである ボンネットの下に。 私たちのようなしかし、スタンフォード、皮革の一種 そのライブラリの少なくともディテール はるかに私たちが行うような目的、 文字列とchar *のために。 しかしGRectとGOval、それらのすべて 君たちはあるか、ものは使用することになります 今週は、最終的にある メモリアドレス。 あなたはそれを知らない。 だから、おそらく、その後驚くことではありません あなたには、いくつかの上旅行かもしれないこと セグメンテーションフォルト。 しかし、今ここで面白いものだ、 我々は我々が行う0をチェックした後であれば 文字列tが秒を取得します。 まあ、私がtを宣言してみましょう。 私は、広場としてそれを描くつもりだ 32ビット、それをTと呼ぶ。 そして、私は何をするつもりだと、秒を取得します。 まあ、それはどういう意味ですか? まあ、それは考えることは少し難しい 賢明それについて絵。 しかしみましょう考える Xの中に何ですか? この変数は内部で文字通り何ですか? 値Ox123。 ちょうどので、私が言うとき文字列tがSを取得し、その 文字通り数を取ることを意味し 年代に、それはOx123でありOx123を置く。 または画像で、のであれば私は一種の抽象 離れてそれが持っているそのディテールから 文字通り何の効果 これだけでなく、。 だから今は、最後の週に戻って考えるとき 私たちは、資本主義T. Iに進ん Tブラケット0でした。 まあ、Tブラケットそれはあっても0、 ポインタは、あるかのように扱うことができ それは、正方形で、アレイの ブラケット表記。 だからTブラケット0がどこにあるのでしょうか? まあ、それは時間だ。 そして我々はそのコード行を使用する場合、 そのC type.hにある2つの上部、 のヘッダファイル、 それが宣言された。 このHを生かししかしのだ 、それはだと同じ正確な時間のコースです Sの中、いわば。 そして今、あなたは変更されているか オリジナルと両方大文字 いわゆるコピー。 あなたは、コピーをしなかったので、 人間はそれになりたいという方法。 だからここに修正は、何だった copy1.c先週? 関数なので、我々は実際にできた 文字列をコピーします。 そして根本的に、我々はには何が必要ですか 文字列をコピーするためにですか? さて、この緑色のバージョンでは、ここで私は それはかなり低いレベルにするつもり。 関数が実際にあります 彼らはこれを助けることができる。 しかし、一つの最も基本的な、そして最も おなじみの1は、少なくとも、すぐになります 私たちにおなじみの、以下の通りです - そう、最初の行に1つ 緑のコードの今。 私はただのchar *としてSを書き直し。 全く機能的ではありません そこの違い。 私はちょうどCS50ライブラリを捨てたと 私は、char *、それが何であるか、それを呼んでいる。 さてドット、ドット、ドット、あったので ではありませんいくつかのエラーチェック 再び話は興味深い。 だから今tが宣言されています。 それはあまりにもchar *型です。 だから私は、上の小さな広場を描いた 前のような画面が表示されます。 しかし、右側に、malloc関数、 我々は、メモリが割り当てていると述べた。 だからメモリの一部のチャンクを割り当てます。 そして、私たちは実際にどのように多くのバイトを行う 割り当てたい、それが見えるのでしょうか? まあ、Sの文字列の長さ。 もしそうなら、それはだこんにちはだ 5になるだろう。 我々は、H-E-L-L-Oと言うでしょう。 だから5バイト。 しかし、その後に1を加え、なぜ1? 0文字。 私たちは、この男たちのための余地を残していない場合 誤って状況を作り出すかもしれない 文字列がある場合、H-E-L-L-O。 そして次回GetStringメソッドです 、と呼ばれ、私は、例えば、を入力 デビッド、D-A-V-I-D、コンピューターが起こっている sが実際にあることを考える H-E-L-L-O-D-A-V-I-Dそこだから それらの単語の間に壊れるません。 だから我々は休憩が必要。 だから我々は、5つのを望んでいない。 我々は6バイトをしたい。 とバイト私は言う。 しかし、それは本当に、charの時のサイズです。 技術的にはcharがほとんどです 常に単一バイト。 しかし、単に我々のコードは移植性を高めるために、 そう、それは上で動作するように、話すこと 別のコンピュータであっても、彼らは可能性がある場合 下に多少異なる場合が フードは、私は一般的に行くよ ようにchar型のサイズを言う 私のコードは常に働く。 そして、私はちょうどそれを再コンパイルする必要はありません 私は自分のコンピュータをアップグレードするか、使用しているため、 いくつかの異なったプラットフォーム。 だから私は、6倍の大きさを持っている 1であることを起こるのchar、。 だから、malloc関数ができたことを意味 私に6バイトを与える。 実際にやっていることは何ですか? まあ、私はここで時間にロールバックさせて 我々は物語のどこにいるかに。 私はここに戻って行くのであれば、私は宣言した Tと呼ばれるchar *型。 私は今、6バイトのために、mallocを呼んでいる。 そして今、私はそれらの6を描くつもりだ ただ配列以前のようなバイト。 しかし、私は実際に何かわからない この配列の内側。 あなたがメモリを割り当てる場合には、判明している あなたには、いくつかがあることを信頼することはできません そこに既知の値。 それは何かによって使用されている可能性が さもなければ、いくつかの他の機能、いくつかの他の あなたが書いたコード行。 だから我々は一般的に、これらのごみを呼ぶことにします 値ととしては、おそらく、それらを描く 疑問符、ちょうどそれを示す我々 そこに実際に何かわからない。 そして、それはあまりにも長い間、私たちのように大したことない それらを上書きするのに十分スマートです ごみ番号の値または 我々は気にしている文字。 したがって、この場合には、私は何をするつもりです? まあ、私のラインは、コード 次、私は4を持っている。 iが0、nは取得する取得int型 Sの文字列の長さ。 forループはおなじみだから。 私は、より小さいまたはnに等しい これは、通常以上である。 しかし、この時間は、それは意図的なのです。 私は+ +、そして私は単にやる Tブラケット私はSを取得します。 私の絵はで、次のようになりますので、 Tに格納されているこの瞬間は、ある メモリのランダムチャンクのアドレス 値が不明である。 しかし、すぐに私はTブラケットを行うように 私をここに置きます0。 そして、何までそこに描かれてき終了? 我々は時間をかけてしまう。 それがSブラケット0であるものだからです。 その後も同じこと 電子、およびl、およびl、およびo。 nは、なぜ私が通って行きました nに等しい? 0文字のために。 私は実際にあれば、これだけ、その後、明確にする 消去どんなこれらのごみ 値であり、その後、実際に描く 私は何を期待、これはSブラケット1、2、です 3、4、加えてそれが末尾だ 新しいキャラクター。 そして今、私たちは、ドットを過ぎて継続した場合 この正しいバージョンのドット、ドット 私はだろうと大文字Tブラケット0の コー​​スは、まさにこれを活用すること ここで男、概念的に、 最終的な目標だった。 だから、すべてのポインタということですだ。 そして、あなたは数週間のためにそれらを使用してきた 今の文字列の文脈である。 しかし、ボンネットの下に、彼らはしている 少し複雑。 しかし、あなたはこれでそれらを考えれば 私は、彼らがしていることを提案する絵フォーム 彼らのように、おそらくすべてのこと怖くない まず、一見思われるかもしれません 特に、新しい構文で。 ポインタに関するご質問、 文字列、または文字? うん? 読者:あなたが戻って行くことができます [聞こえない]に? SPEAKER 1:確かに。 読者:あなたの一番最後に来る、どのよう ラインは、あなたは、* Tラインを持っていない と* Sラインで? あなたへの参照を持っていない - SPEAKER 1:ああ、本当に良い質問。 なぜ* tと* Sを持っていないのですか? なぜなら私たちのように簡潔に、先週、 機能を入れ替え、私はそのとき言いました あなたはによってポインタ手段を持っている 我々がしたように、あなたはそこに行くどの 物理的にステージ上で、実際にあった スター演算子を使用します。 これは角括弧ことが判明 表記法は、我々は構文呼ぶだろうものです だけのセクシーな方法である砂糖、 のためにそれの簡単な表記法を言って 正確に記述しているもの。 しかし、それはもう少し直感的だ。 と意思の​​危険にさらされて、これはより多くのように見える 、それは必要以上に複雑に 何が本当にここで起こっている 次のようになります - 私はに行くことを意味* tを言うなら Tに格納されているアドレス。 だから文字通り、保管tがされた場合 そのHのアドレス 当初は、* tはここに行くことを意味します。 さて、Tブラケット0は何を意味するのでしょうか? まったく同じもの。 それはちょうどもう少しユーザーズ 書くことが優しい。 しかし、私はまだいないよ。 私はちょうど* tは* Sを取得すると言うことはできません。 ので、私はその後、何をやっているでしょうか? I hは、H、H、H、Hを入れていまし 全部を通して。 右? * tがあるのでTのアドレスにアクセスしてください。 しかし、我々はループの内側です。 そして、私は、何の値をインクリメントしています もちろん、各反復で? 私。 しかし、機会があり ここで、右? それはなってきたように、これは感じているにもかかわらず もう少し洗練された 角括弧表記より 我々はいくつかの時間を使用してきました - 私はそこに私の時間の変更を取り消しさせて - これは今少しを取得しているにもかかわらず * Tであれば、基本的な考え方、手の込んだ ここで意味すると* tはただです T内のアドレスにアクセスしてください。 しかし、Tのアドレス何でしたか? 我々が使用し続ける数? Ox456と同様に、そのバックを持ってみましょう 単に議論のために。 まあ、私は内の電子を取得したい場合 Tの文字列は、私はちょうど、に行きたい 本質的には、456。 というか、457。 私はちょうど1を追加する必要があります。 しかし、私は右、それを行うことができますか? tは、私が図面を保つにもかかわらずので 矢印として、それは今では、それだけだ 番号、Ox456。 そして、私はそれに1を追加した場合、またはそれ以上 一般的に、私は私にできることに私を追加した場合 私が欲しい場所を正確に、実際に取得します。 だから私は実際にこれを行う場合 - そしてこれは今と呼ばれるものです。 ポインタ演算 - 私は、この行を削除することができます。 率直に言って、どちらが、私はより明確と思う 読みもう少しユーザーフレンドリー。 しかし、これは劣ら正しいではありません。 このコード行は、今使用している ポインタ演算。 これは、に行くと言っています 次のアドレス - Tの開始が何であれ、その 当初はTプラス私、です 素晴らしいですが、これは0である。 それは、Tの始まりを意味するので、 プラス1、プラス2、プラス3などが挙げられる。 sのと同じ契約。 このためだから糖衣構文。 本当に何が起こっているのかしかし、理解 ボンネットの下に、私は主張するだろう それ自体との実際に有用です。 それが今ではそこにはないことを意味しているので 起こってはるか魔法 ボンネットの下に。 多くのことをそこに行くされていません 私たちはあなたのために皮をバックアップできる層。 これはc。 そして、これはプログラミングされています。 質問本当に良い。 すべての権利なので、これはそのバグだった 私は以前に言及されたプログラム。 スワップが欠陥だった。 場合は、動作するように思えました。 ただミルクで好きなことを思い出してください オレンジジュース - 私が始め 今日のデモを飲む。 だからオレンジジュースと同様と 牛乳は、我々は使用する必要がなかった 保持する一時変数、TMP、 一時的に、我々はそれからできること Bを更新し、その値を変更して。 しかし、この機能は、我々が言った、またはこの この関数があったているプログラム 書かれたことは間違っており、欠陥だった、なぜですか? はい? 読者:[聞こえない]。 SPEAKER 1:その通り、時 あなたは、スワップを呼ぶ - より一般的には、ときに ほとんどの任意の関数を呼び出す - その関数への引数は、ある場合に 原始的な、いわば、intと文字 とダブル、山車、物事なし 星、あなたはのコピーを渡している 引数。 xが1であったとyが2であったのであれば、起こっている 1であることが、bは2になるだろう。 しかし、彼らは別のチャンクことになるだろう のビットは、異なるチャンクの 保存することが起こるメモリ 同じ値。 だから、このコードは超完璧です aとbを交換で。 スワッピングでは良いことだん - 先週の例では - xおよびy。 再び、彼らはだから 間違った範囲である。 さて、我々はこれを修正する方法についてでしたか? 我々は、関数をしなければならなかった 少し醜いに見える。 しかし、再び、何を考える これは単なる意味。 そして、実際に、一貫性を保つために、私を聞かせて それはと同じですので、一つのことを変更する 先ほどやった。 私が先週述べたように、それがない それがどこに行くかは問題で。 実際には、一般的には入れるでしょう 変数名の横にある星。 しかし、私はそれが少し楽になると思います 隣に*を検討する それはポインタの意味として、データ·タイプ この場合はintへ。 だから私はここで何をやっている? 私は私にint型を与えていない言っている 別のint型に続いて、 それらのaとbを呼び出す。 私にint型のアドレスを与える。 私に別のint型のアドレスを与える。 aとbそれらのアドレスを呼び出します。 そして*表記を使用してダウン 以下に、それらのアドレスのそれぞれに行く どちらを取得するために、必要に応じて またはその値を設定します。 しかし、ここでは例外があります。 なぜ私はtmpに隣に*を持っていないのですか? なぜ私は、例えば、これをしない? 私はすべてに行く必要がありますようにそれは感じている アウトと全部を修正します。 うん? 読者:[聞こえない]。 SPEAKER 1:私は宣言していない 文字列としてtmpに。 従ってこれは、この場合には、宣言する tmpがint型のアドレスになるように。 しかし、それは、私が欲しいものはかなりありません いくつかの理由のために。 聴衆:あなたはそれらを交換する必要はありません。 SPEAKER 1:その通り、私は交換したくない tmpを使って何。 tmpがただです 週1のもの。 私が欲しいのは変数です いくつかの数字を格納する。 私もアドレスを気にしない 現時点では。 私はちょうど32ビットを必要とするか、または そうint型を格納する。 そして、私はそれらの32ビットに入れたい どんないわば、ではありませんが、 ただより正確に、でたものです。 アドレスである場合、*を意味しますので、 そこに行くと値1を取得します。 たとえば、先週の例で または、bの場合には、2の値を取得する。 だから何が本当に起こっているの? 私は意志ここで絵を描いてみましょう 今日だけの一部を離れていじめる。 しかし、これは表示されていきます かなりの時間のために。 これは、私が主張し、何をお使いのコンピュータのある メモリは、あなたが実行したときのように見える プログラムは、任意のプログラム。 あなたは非常に上部にプログラムを実行すると コンピュータのRAMの - そう考える あなたのように、本当にこの長方形、 コンピュータのRAMやメモリ、全101 それの億バイト、すべての20億 バイト、それのすべて2ギガバイト、 あなたが持っている量があるものは何でも、 それは長方形として描画してみましょう。 そして、私はあなたがプログラムを実行するときと主張 Microsoft WordやChromeのような またはそのような何か、そのビット MicrosoftまたはそのGoogleが書いた - これらのプログラムの場合で - コンピュータのメモリにロードされ それらは、より実行することができる 迅速かつ供給CPUに、どの コンピュータの頭脳である。 とTAMに彼らは非常に格納されている あなたのプログラムの先頭には、いわば。 つまり、これはチャンクである場合 メモリには、ダブルクリックしたとき Microsoft Wordの、ビットが来る ハードドライブをオフにします。 これらはRAMにロードされ。 そして、我々は非常に上部にそれらを突き出すよ この長方形の概念的。 さて、あなたのメモリの残りの部分はある さまざまなことに使用されます。 一番上には、初期化を参照してください データとデータの初期化を解除。 これはと共に、大部分は、関係している 定数やグローバル変数 それは値を有する。 それらの別の時間ではなく、もっと。 その後は、ヒープを持っている 我々はに戻ってくるでしょう。 しかし、一番下にあるの一部である 特に今は密接。 それは、いわゆるスタックだ。 だからここでほとんどすべてのDホールで好き キャンパスは、それらのトレイを持っている わずかに互いの上にスタック あなたは、食品やその他もろもろを置くことができます。 コンピュータシステム内のスタック 非常によく似ています。 我々が使用するように、トレイのに対し除く 食堂は、もちろん、意味している 物事をトレイを運ぶために またはフレーム - 我々は彼らを呼ぶことにしますように - コンピュータの中 メモリが保持するために使用され 変数と値。 だから、本当に何が起こっ ボンネットの下に? まあ、私は裏返してみましょう ここで画面に。 とにだけ焦点を当ててみましょう 瞬間のために底部。 これは私の一番下の部分である場合 コンピュータのメモリは、それが判明したとき、私 関数main呼び出し - それは、率直に言って、どうなる 自動的に私のために - 私は、メモリのチャンクを取得 いわば私のRAMの一番下。 どこだメインとこれは ローカル変数は行く。 どこのargcとargvは多分それはだ 移動して、任意の変数I メインの内側を宣言します。 彼らは、底に終わる 私のコンピュータのRAMの。 今ではメインの呼び出し機能を仮定 スワップのような、それは先週やったような? さて、私たちは本質的に、新しいトレイを置く メモリの私の塊の上に新しいフレーム、。 そして、私はこのように記述するつもりです スワップ機能に属する。 今、スワップの内側は何ですか? さて、先週のプログラムに基づいており、 先ほどからの抜粋を見て1、 スワップの枠の内側、またはスワップのオン トレイ、どの変数がありますか? さて、aとb。 それらは、その地方の引数であったため、 プラス三、TMP。 だから本当に、私はこれを描くことができ もう少しきれいに。 私が先に行くとラベルを取り消しましょう​​。 そして、私はあなたが何を知っていることを主張させて? おそらくここで終わるだろう。 Bはここで終わるだろう。 とtmpがここで終わるとしている。 さて、順序はかもしれない 多少異なる場合が。 しかし、概念的には、これはアイデアです。 そして、ちょうど集合的に、これは何ですか 私たちは、スワップの枠を呼び出す、またはよ ダイニングホールトレイ。 メインで、同じ取引。 しかし、私はそれを再描画しません。 しかし、それはどこのargcとargvと任意のだ xとyのように、そのローカル変数の 同様かもしれない。 だから今は本当に何が起こっているかを検討 あなたはスワップを呼び出すとき。 次のようなコードを実行して、スワップを呼び出すとき これは、中に渡している バギーバージョン、aとb xとyのコピーである。 私は今、これを描くんであれば 画面上で - これで良くなるようになった - 私は自分自身に言っていた話はそう 、このバギーバージョンにあったときに、私たち 文字通り、aとbを渡すスワップ呼び出す 整数として、何が本当に起きているのでしょうか? まあ、これは本当に起こっているのです。 私が先に行くとだけアンドゥう ここにいくつかのスペースをクリアします。 だから、これは私のコンピュータのメモリである。 私が持っているのであれば、例えば - 実際のは、このようにそれをやらせる - 私は、これは保管、Xであることを主張する場合 ちょうど先週のような値1。 そして、これは値を格納する、yと ちょうど先週のように2。 そして、これは、私がスワップを呼び出すときに、メインである それによって、自分自身へのアクセスを与え、 bおよびtmpが、私はそれを主張するつもりだ これは、これは1である。 これは、bは。 これは2である。 これはTMPと呼ばれています。 そして、最初に、それはいくつかのゴミの値を有する 私は実際にそれに格納されるまで、 これは、1です。 それから私は先に行くと変更 何のことですか? Bの値。 そして今、私はここで2つを持っている。 そして、我々は、bはTMPを得ると述べた。 繰り返しますが、単に健全性チェックとして、第三 ここでコードの行は、単にこれです 1、bはTMPを取得します。 そして最後に、私は何をすればよいですか? 私が先に行くとどんなことをBに変更 TMPの値が1である、である。 私は再びtmpには触れないでください。 しかし、今、問題は、すぐに交換のようになります。 を返し、それは手渡しではないので いくつかの値をバックアップし、ノーリターンではありません 文は、その中に明示的に。 実際に何が起きているのでしょうか? まあ、基本的にすべてこのメモリ - [OK]を、明らかに消しゴムは好き 同時に複数の指 - ただ消える。 今、現実にはそうではありません どこでも行く。 しかし、あなたはそれについて考えることができます 今疑問符として。 それはもはやいないので 実際に使用中です。 そして、何もそれらの値で行われていません。 だから緑のバージョンの場合 このコードは、代わりに何がされている スワップに渡される? だから、対処しています。 だから、xのアドレスと yのアドレス。 我々は、もしそうなら、この物語最後の再伝える 時間、私は実際に、再びスワップを描く しかしポインタで、これは、このている Bであること、そしてこのことtmpの、何ですか 実際にこの緑に格納 私が渡している私のコードのバージョン アドレスに? これは、Xへのポインタになるだろう。 だから私は、矢印を描くことができます。 しかしみましょう、同じ任意を使う 以前のように例。 Let 'sは、これがあると言う Ox123のようなもの。 そして、これはOx127であることを行っているので、 それはだから、それは4バイト離れてい int型なので、Ox127。 そして再び、私はいくつかの自由を取っている 番号を持つ。 彼らは場合よりもはるかに小さいです 実際には別の順序であると。 しかし、それはどのように絵だ 今とは異なります。 しかし、私は、この緑色のコードを使用するとき と私はint型tmpが*入手できますか。 は、次の操作を行い取る*手段 でのアドレスとそれに行く、 これは、1です。 そして、それは私はその後tmpに入れたものだ。 一方、コードの次の行に ここで、* Bを取得し、それが何を意味するのでしょうか? さて、*ので、ここに行くを取得* B、 これは、そこに行くことを意味します。 そして、そこに価値を置くことを意味します。 最後に、コードの最後の行 単に* bはTMPを得ると述べた。 だからbがそこに行くとそれを上書きすると言う 起こっている、この場合には、TMP 、再度、1とする。 そして、これが理由の緑バージョンです 我々のコードは、赤のに対し、働く バージョンはことはなかった。 どのようにダウンして、それをすべてちょうど沸騰 メモリが管理され、それはどこにされて 実際に配置され コンピュータのRAM。 そして今のところ、それは物事の一つだ スタックが使用されていること。 レイアウトに関する質問? ポインタか? またはスワップに? すべての権利なので、malloc関数、リコール、 このような何かをした。 これは超簡単な例でした。 そして、これは1つだったBinkyの とはいえ、非常に、私たちを導入 すぐに、クラスの終わりに。 くそ、そこに我々は再び行く。 だから、これは例であったことを思い出している Binkyのはいえ、私たちを導入 やや素早くクラスの終わりに。 そして、ここで私たちは本当に、mallocを使用 二度目の。 初めてなので、我々はそれを使用 十分なRAMを割り当て、十分なRAMを作成する 文字列を格納する。 今回はBinkyのそれはシンプルに保つ。 だからそれだけで保存するためだ int型、明らかに。 そして、それは完全に大丈夫です。 それはに、率直に、少し奇妙なことだ 1 int型を割り当てるためにmalloc関数を使用しています。 しかし、ニックのクレイメーションのポイントだった 本当にただ何の話をする 起こるとき、または発生しません あなたは、メモリを虐待。 したがって、この場合には、このプログラム いくつかのことをやった。 ここで最初のケースでは、それを宣言 intにXと呼ばれるポインタ。 その後、ポインタを宣言しています intにYと呼ばれる。 その後、Xに何を格納? 今、他の誰か。 に係るXに格納されるもの このプログラムの3行目? 読者:[聞こえない]。 SPEAKER 1:まあ、かなり 言うあたりのバイト、。 今より正確に。 Xには何が格納される? アドレスは、私はそれを聞いたと思います。 だから、malloc関数は何を返すのでしょうか? mallocの行動を割り当て メモリのチャンク。 しかし、どのようにそれはあなたがそれにアクセスできるようにしますか? それは何を返す? 最初のバイトのアドレス メモリの塊である。 さて、これは超簡単です。 それだけを意味し、1バイト、だ 我々は戻って取得しているアドレスです 全部のアドレス。 それではXに保存されている、アドレスです メモリのチャンクの。 その間、何が次に起こる? だから実際には、のは先に行こうと これを本当の高速を描く。 だから私たちは、ここで画面の所へ行く場合 我々はこれをプレイするint型* xとint型* Y 私のために何をするつもりか? 私はそれだけで行うために起こっていることを主張する このような何か、それXと呼び、 これとはyを呼ぶ。 一方、コードの3行目です int型のサイズを割り当てるつもり、 申し訳ありませんが、私が言ったら - それはであることを起こる 私は1つのint型を意味する前に、1 - 典型的なコンピュータ上の4バイト。 少なくともCS50アプライアンスと。 だから、これは割り当てるために起こっている それは、誰が知っている? どこかここに。 これは一部に格納されている アドレス牛、知っている? しかし、何が返されるために起こっている そのアドレスです。 しかし、我々は絵で、これを描くよ としてそのようなただ矢印。 今、次の行の*×42を取得します。 * xが普通の言葉で何を意味するのでしょうか? ただ、そこに行く。 そのアドレスに移動します。 換言すれば、フォロー 矢印とそこに42を置く。 しかし、その後、何か悪いことが起こった Binkyのに対して、右? * Yが取得する、ここでそのライン5を思い出す 13、確かに不吉な数、 私たちのために何をした? まあ、* yはそこに行くことを意味します。 まあ、これは与えられていない まだ値、右? コー​​ドは、yがあることはありません 何に初期化。 我々はX初期化されていた アドレスへ。 しかし、yが上部まで宣言されました。 しかし、その後、セミコロン、値なし 実際にそれに入れた。 だから、これを呼び出すために公正である ゴミ値。 誰が何を知っている? これは、使用されたビットの残党だ のコードのいくつかの前の行で 私のプログラム。 私はそこに行くと言うのであれば、これは、のようなである 私は、この矢印は見当がつかない 終わるつもり。 ときに、通常、そして、それはだ セグメンテーションフォールトを取得します。 あなたが誤って逆参照した場合、そうする 話すかどうかのアドレスに行く 実際に合法的なアドレス、 悪いことが起こる。 そして、それは起こったことがまさにそれだ Binkyのだと思います。 だから、ニックだったことその話思い出す ここで伝えることは同じ考えだったかのように 私の錯覚で描かれてきた そこにボード上のチョーク。 XとYは、宣言されています。 その後、我々はサイズを割り当て int型とXでそれを保存。 その後、我々が行った次の行* X。 これはニックの魔法の杖だった 間接参照の。 すなわち、メモリ42に入れ xで指摘した。 しかし、これはあるもの 恐ろしく間違っていた。 右? 我々はデリファレンスyに試してみました。 しかし、yは右、いくつかの偽の値を持っていた? 左下でその矢印 コー​​ナーではない 実際には何を指している。 それは何をやって私のようなものだ ボード上でここにしました。 だから、悪いことが起こる、セグメンテーション この場合の故障、またはBinkyの障害、。 しかし、我々はその後、xを実行していることを修正した場合 yは取得する方法ストーリー変化していますか? まあ、私はXを行う場合の、yを取得します と言うように効果的に同じ これが何であれ、牛か 、ここで同じことを行っている 牛何か。 または絵で我々は、矢印を描画します。 だからここBinkyのとオンボード、 の次の行で コー​​ド、* yはそこに行くことを意味します。 そこどこですか? それはこっちを意味します。 そして、我々は13になることを更新するとき それだけで行くと関与 今ここに13を書く。 ので、おそらく完全ではない 一見単純明快。 しかし、要約すると、同じ専門用語を使用するように Binkyのがここで使用していたので、 最初の二つは、ポインタを割り当てる xとyはなく、指示先。 と指示先ではありません 一般の用語を使用していました。 しかし、ポインタは絶対です。 しかし、それは指摘されているものだ Binkyのの命名でで。 もちろん、この次の行、 int型ポインタの指示先を割り当てます。 だからメモリの塊 - 私は上のように描い 右手そこ側 - とセット それを指すように等しいX。 この間接参照xは42に格納する それを指しているメモリ。 そしてこれは、もちろん、 悪いものだった。 yが指していませんでしたので、 まだ何で。 これは、それを修正します。 だから、これはまだバグのプログラムです。 我々は吹き抜けるいるという理由だけで コー​​ド行ずつと言って、まあ、 それはそこにクラッシュすることができます。 それは悪いことだ。 オッズは、プログラムだけに起こっているのです そのラインで完全に中止。 削除した場合でも、クラッシュ ラインと最後の二つと交換 割り当てるそこ行 - Y - ポインタの割り当てを使用して 点tのようにXを指すように。 そしてあなたは間接参照 非常に安全な方法でY。 だからここで、これは私たちを残していない? さて、フードの下のことを判明 CS50ライブラリに、ポインタです 全体で使用される。 そして、私たちは実際に皮に始めましょう ずっと前に戻ってそのレイヤー。 しかし、それは、あまりにもその式を回す あなたのいくつかは、精通しているかもしれません 特に、より快適な、 非常に人気のあることは実際にある ウェブサイト、またはスタックオーバーフロー、 このごろ。 しかし、これは実際には非常に持って 技術的な意味。 我々は今、スタックが何であるかを知っている。 これは、トレイの積み重ねのようなものだ ダイニングホールの内部。 または内部のコンピュータの数 メモリはこれらのフレーム それは、関数で使用されています。 まあ、それはそのせいであることが判明 の非常に単純な実装 メモリと、いわゆるオンフレーム スタックには、実際に制御を取ることができます コンピュータシステムのかなり容易。 人いる場合は、システムに侵入することができます 私たちのように私たちのコードを書いていない 特によく。 私たちのような人々は、チャンクを使用する場合 メモリまたは使用のアレイ - さらに一般的に - 時にはチェックアウトすることを忘れ 我々の配列の境界あなたはともかくとして 自分は時々持っている、と反復 あまりに遠端配列過去の方法。 最良のケースでは、あなたのプログラム ただクラッシュする可能性があります。 セグメンテーションフォールト、一種 恥ずかしいの。 素晴らしいではありませんが、それは必ずしもありません 非常に悪いこと。 しかし、あなたのプログラムは、実際に実際にある場合 それは実行している場合、ユーザーのコンピュータ、 ウェブサイト上で、実際のランダムな人々 インターネット上させる、ヒットしている 人々はあなたのコードに悪いことを誘発され なぜなら一般的には良いこと それは取る機会を意味 コンピュータの制御。 そして、これは見に行くさ 少し不可解。 しかし、私はあなたを怖がらせるとしようと思いました ここではこの最後の例。 ここでは、コードの例です。 そして、良いウィキペディアはあり を歩く記事 さらに詳細にこれ。 私は底の通話のメイン持っている 1のARGVを渡しfooを、。 そして、それはちょうどので、あなたができることです プログラムを実行し、合格 任意の入力。 そして、fooが上部まで宣言されています 文字列を受け入れ、以上と 正確には、char *型。 その後、文字の配列を宣言します。 より一般的には、バッファ呼ぶ サイズ12の。 だから、12文字は内に収まることができます Cと呼ばれるその配列の。 そして、それは、この新機能を使用しています 新しいなくするのは難しいされていない 、メモリコピーを理解しています。 それはあった、バーからメモリにコピー 可変過去nを、どんな CにARGV 1に入力されたユーザ。 何バイト? バーの文字列の長さ。 そう換言すれば、ユーザは種類のif H-E-L-L-O入力文字列の長さ こんにちは5つです。 だから、それらのバイトの5人が取得する予定です Cと呼ばれる配列にコピーした サイズ12である。 しかし、はるかに長いのユーザーが、タイプ 13文字または14の言葉 文字や100文字以上? 彼らはどこに行くつもりですか? まあ、そのフレームは、そのトレイ ダイニングホールスタック内の、 彼らはそこに行くつもりです。 そしてそれは単に上書き始めるために起こっている すでにだ他のもの そのスタックに、あふれ スタックは、いわば。 だから画像で、それをこの方法を考える。 これはただのカラフルバージョンです 絵は、我々は描画してきた。 下部には、メインである、と言ってみましょう。 その上に、あなたは今何を見ている ために、今ではコード化されたフレーム、カラーです fooという関数です。 しかしについてはこちら面白いものだ fooが、ここでそのフレームであるということです。 だから、それはちょうど私のように描かれています しかし水色でやった。 そして今、これはどこにある Cブラケット0が入ります。 ここで、cブラケットとこれは 11が終わるとしている。 換言すれば、に起こる 正方形として表される。 しかし、あなたは単にバイトをplopping続ければ ダウン - または文字 - 彼らは終了するつもりだ 最高の場所で0までのすべての方法 11それがインデックス0であるため。 しかし、13日の文字はどこにある 終わるつもり? 14日はどこにありますか。 50番目の文字はどこにあります 終わるつもり? それがダウンし続けるために起こっている。 私たちが描かれたにも関わらず、そのため 育っスタック絵、 アドレスは、結局のところ、から行く 小さな小さなアドレス、 大きなアドレスへのポインタ。 だから、ちょうど行くと最新の状態に保ちます。 だから、ユーザーのタイプの場合 こんにちは、それは素晴らしいことだ。 いいえバグなし、問題、皆の安全。 しかし、我々はよ何でユーザーがタイプなら 表され、敵対コードを呼び出す 一般的に、攻撃、攻撃など、 攻撃、攻撃、何が起こるでしょうか? まあ、もし入力のすべてがユーザ に入力しただけでいくつかの友好的ではない の文字または文字列攻撃。 これは、実際に一連の文字です そのあなたがそれをコンパイルした場合、 それは実際にコードです。 たぶんそれはコードだとすべて削除 あなたのハードドライブ上のファイルやスパム送信 そのような、または何か。 キーはここで何だということに気づくと、そのある 悪い男がするのに十分幸運場合 メモリの赤い塊を上書き - 私は自分の絵で描きませんでしたが、 ここでは、このWikipediaの画像持っている - そのいわゆるリターンアドレス。 ときに食べ物を返し、スワップリターン、 コンピュータがから行く方法を知っていない ここまでダウンしてここまで? または最大上記のハイテク部門で、どのように それはスワップから行くように知っていますか コー​​ド - 0と1 それはスワップを構成する - メインページに戻る? いわゆるリターンアドレスがあります に、その同じスタックフレームに格納されている 同じカフェテリアトレイ。 悪い男がするのに十分賢いですのであれば 攻撃コードを入れて、攻撃コード、攻撃 コー​​ド、幸運を得る - しばしば試行錯誤 - へ 、その赤いリターンアドレスを上書きする アドレスと通知と 非常にトップ。 0835C080に注目してください。 これは、後方のトップを書かれている 理由は、私たちは、おそらく再訪よ。 これはその数です。 悪い男は幸運になるのであれば、または 赤を上書きするのに十分スマートです のアドレスを持つメモリのストリップ 彼または彼女は何とか持っているコード お使いのコンピュータに注入、その推測 コー​​ドはに戻されるために起こっている fooが実行中に行われるとすぐに? 悪者のコード。 再び、AAA、この攻撃コードは、そう、かもしれない スパムを送信する、すべてのファイルを削除する可能性が あなたのハードドライブ上の。 しかし、それはどのような本当にスタックオーバーフローです であるか、バッファオーバーラン、または バッファオーバーフロー攻撃。 そしてそれは信じられない、信じられないほど一般的です で書かれたプログラムを使用してこの日に C、C + +、さらにいくつかの他の言語。 その恐ろしいノートでは、我々はよ 冗談で終わる。 [笑い] 水曜日にお会いしましょう​​。 次CS50で - だから私は、今日のディスクランプのすべてのアウトだけど 待って、無脂肪牛乳、半分電話 本、オレンジジュース 今日は飲んだ。 USBケーブル、レンチ。 [音楽再生]