>> [音楽再生]
>> 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ケーブル、レンチ。
>> [音楽再生]