[音楽再生] DAVID J.マラン:すべての権利。 これはCS50である。 そして、これは週5の開始である。 そして、あなたは気づいている可能性がある、 材料の一部 もう少しを得ている 複雑な、少しより高密度。 そして、それは、特に場合、非常に簡単です あなたは、いくつかの時間を習慣にしてきた ほとんどのダウン走り書きしようとしているように 私たちは何でも、私達はクラスで言っている。 しかし、それはおそらくありませんが、実現 理想的な教育学的アプローチ この種の材料を学ぶために、 材料より一般的。 そして、私たちはして満足している そのCS50自身Ghengを発表 ゴングが準備を始めている ノートの標準的なセット コー​​スの希望 これは、これらは、その一つである だけでなく、として機能 リファレンスとリソース 材料の見直しや行くため バックかもしれない材料を通る あなたの最初の頃を免れたが、 また、ヘッドはもっとできるように ダウン、ときにそれをよりアップ 講義を時間が来る、 あなたが従事する可能性がありますように もっと思慮深く、として もっとscribblyに反対。 ということで、あなたは何を見つける ウェブサイトは、このようなドキュメントである。 そして、通知は、左上にある、あります 目次だけではなく、 だけでなく、タイムコード、その すぐにジャンプします 適切な部分へ ビデオオンラインでの。 そしてここでチャンは何を行っている 、本質的に、文書化されています この中で何が起こった 特定の講義。 そして、講義の多くは、 すでにオンライン今、このURLに置き換えてください。 そして私達は残りを掲載していきます 今週の終わりまでにそれらの、 その結果、リソースを活用します。 だから、前置きなしに、 私たちは戻って剥離し始めた されている層 しばらくの文字列。 そして、私たちは、文字列を何と言った 実際に先週は何ですか? だからチャースター。 チャースター、よく、どのような それは本当に意味した? さて、このすべての時間、私たちはしている場合 関数を呼び出すされて、 のgetStringと、記憶などの いわゆるリターン 内のgetStringの値 それは呼ばれていますvariable-- 私たちが書いてきたstring-- Sタイプ そこまで上記のコードの行。 私は私を見ると、それが唯一だ ここに拡大された手書き 私はこれがいかに凶悪な理解ください。 しかし、のはそれを想定してみましょう、 右側に 、それにもかかわらず、合理的である 何の描写 このすべてに起こって のgetStringと時間。 のgetStringは、もちろん、文字列を取得します。 しかし、それは本当に何を意味するのでしょうか? それはのチャンクを取得します意味 オペレーティング·システムからメモリ 関数を呼び出すことで、malloc関数と呼ばれる。 しかし、もっとその上で後で。 そしてそれは移入 メモリのチャンク ユーザーが持っている文字で もちろん、続いて、タイプ入力 null文字、またはバックスラッシュ 最後の最後でゼロ。 一方、左側の この物語の、すべてのこの時間、 私たちは、sのように、変数を宣言してきた。 そして、その変数は今何をしている ポインタを呼び出して起動します。 それは、その内部のボックスではありません 私たちは、文字列を入れて、祈る、それ自体が、 むしろ私たちは、その広場に置く まさに左側のボックス? うん? 聴衆:のアドレス どこにそれがメモリ内に位置し。 DAVID J.マラン:その通りです。 祈るのアドレス メモリ内に位置しています。 そして、ここで祈るのすべてが配置されていない、 それ自体が、特にアドレス 何の? うん? 聴衆:最初の文字。 DAVID J.マラン:最初の文字 この場合には祈る、中、 私は任意だっ提案 そして非現実1、OX1、 これだけのことを意味 1の16進数の数。 しかし、それはおそらく起こっている はるかに大きな数であるように 私たちは引く可能性があることを 接頭辞として0xを、 16進文字を表す。 そして、私たちはどこに知っている必要はありませんので、 祈るの文字の残りの部分 なぜならどんなシンプルなデザインで、ある 何年も前に作られた決断? うん? 聴衆:バックスラッシュ0。 DAVID J.マラン:ええ、その通りです。 バックスラッシュ0ではあるが、あなたを可能にする 文字列を横断する線形時間、、 左から右に歩いて、 forループ、またはwhileと ループ、またはのようなもの それは、ここで、ああ、決定する この特定の文字列の終端である。 でちょうどアドレスを持つので、 文字列の先頭、 私たちは全体にアクセスすることができます それは、すべてのこの間のため、 文字列はただのcharスターでした。 だから、継続して使用することが確かにいいのよ CS50ライブラリと、この抽象化、 いわば、私たちはよする 正確に見始める 何が起こっているされています この全体の時間の下に。 だから、この例を思い出すことができ、 あまりにも、前回から、0を比較し、 これ実際に比較しませんでした。 しかし、私たちはこれを解決し始めた。 しかし、として、おそらくリフレッシュ、 私は誰かは興味があります ピンクのゾウ、今日、 また、チャンによる? どのように前のあなたは? [聞き取れない]。 アップさあ。 そして、その間に、 あなたが出てくるように、してみましょう ちょっと考えるもの このコードは、実際にやっていた。 これは、2つの変数を宣言しています トップ、sとtとのgetStringを呼び出す。 これは、非常にユーザーフレンドリープログラムではありません それはあなたを教えていないため、何をすべきか。 しかし、ちょうど私たちがしていると仮定しましょう ジューシーな部分に焦点を当てた。 sが等しい場合と、私たちは、何 Tに等しく、それはprintfの言う必要があり、 あなたが同じことを入力しました。 こんにちは。 あなたの名前は? JANELLE:ジャネル。 DAVID J.マラン:ジャネル、 よろしくね。 であなたの課題は、そう このゾウのための手 最初の私たちに何の絵を描画することです これらの最初の二つで表現されている ライン。 だから、sとtは次のようになります。 どのようにスクリーン上に表現? そして、あなたはただでそれを描くことができます この大画面上で指。 だから、二つの半分にはありませ その方程式の各側面。 だから、左のsはそこだし、 その後、右側にのgetString。 そしてtは、左側にあります そして、右側ののgetString。 では、どのように始めるかもしれません その絵を描く 何が起こっているかを表す ここでは、メモリに、あなたは言うでしょうか? そして、私はあなたが説明させてみましょう あなたが行くように、あなたは何をやっている。 JANELLE:わかりました。 さて、最初に、それは尋ねることになる あなたが入力文字列を取得します。 そして、それは申し訳ありませんが、ああstore--だろう。 DAVID J.マラン:わかりました。 グッド。 そして、これは何と呼ばれている? [OK]を、ああ。 続ける。 私は、中断することを意味するものではありませんでした。 JANELLE:申し訳ありません。 だから、に入力してだろう アドレスがわからないof--。 私は正確に番号を覚えていないことができ、 私はそれは0から始まると考えていました。 DAVID J.マラン:それはすべての権利は​​、 私は数字を作ったので、 そう何正しい答えはありません。 JANELLE:0アークで開始。 DAVID J.マラン:そう、要素0。 かしこまりました。 JANELLE:そしてあったか ちょうど二letter--様 DAVID J.マラン:OK、あなたに戻って。 JANELLE:だから要素0、および その後エレメント1またはエレメント2。 その作品のそして:DAVID J.マラン 写真は、あなたが今、描いていますか? のgetStringへの呼び出し? またはsの宣言? JANELLE:宣言 Sの、私は信じています。 ああ、getStringで、それはなるため 各【に入力する?エリア。 ?] DAVID J.マラン:良い。 その通り。 効果的なのに、この 配列、リコールを返し、 私たちは、文字列を取り戻すとき、私たちはすることができます 01および2を使用して、その文字列のインデックス。 技術的には、これらは、おそらくです 個別のアドレスによって表される、 それはいいのよ。 私はちょうど速くできればそう、とします 私たちは中断したところに転送 前回、1の場合 文字列は、B型電子gであった それによって、ゲイブ年代を代表するバックスラッシュ0、 入力は、どのように私たちは今のを表しているのでしょうか? これのメモリがある場合 のgetStringにより返されていますか? JANELLE:それは次のようになります アークが表す? DAVID J.マラン:アークによって? いや、まあ。 ちょうど絵で、としましょう​​、 私はちょうど先に行きましょう これはsである場合、このことを提案 のgetStringの戻り値です。 そして、あなたはその、0、1、2として、これを描いた われわれので、完全に合理的である のような文字列のインデックス、することができます。 しかし、単にと一致しているように 前回、私が先に行かせて 任意このことを提案する アドレス1であり、これがアドレス2であり、 これ等アドレス3、及びである。 だから、ちょうどスーパーであると 明確な、何が起こっている その結果として、年代に行くために コー​​ドの最初の行には、と思いますか? JANELLE:住所1? DAVID J.マラン:その通りです。 だから、0x1の対処。 そしてその間、私が先に行くとしましょう あなたがやったことの多くを複製 そして、ここで私自身のトンを追加します。 私はゲイブを入力した場合 再び、二度目、 のgetStringでメッセージが表示されたら、どこで、 もちろん、ゲイブは行くつもりですか? さて、presumably-- JANELLE:ここでの、気に入りましたか? DAVID J.マラン:うん。 JANELLE:それとも同じ箱にもですか? DAVID J.マラン:ええ、私は提案してみましょう、 正確には、これらの追加のボックスにそう。 しかし、今の鍵なのはあっても、ということです 私はこれらの非常に近くに描いていますが 0x1のtogether--、この 実際に0x2--され、 これは現在、アドレス0x10のかもしれない 例えば、および0x11を、と0x12の、 など。 ですから、そのような場合、 何トンで、ここで終わるために起こっている? JANELLE:0x10を? DAVID J.マラン:その通りです。 だから、0x10を。 だから、今、最後の質問。 あなたは、はるかに、仕事を持っていた これまでゾウのための最も難しい。 今では、私は、コードをプルアップした場合 再び、私が行うとき、ライン3において、 sがtと等しい等しい場合、私は実際に何をしてい ここで描かれたことと比較する? JANELLE:二つのアドレス? DAVID J.マラン:その通りです。 だから私は、tに等しい等しくSで言っている? 言い換えると、1〜10に等しい等しい? そしてもちろん、 明白な答えは今ありません、です。 だからこのプログラムは最終的にある 何を印刷しようとして、あなたは言うでしょうか? JANELLE:それは次のようになり、 あなたが同じことを入力した? DAVID J.マラン:もしそうであれば sが1であり、tは10である? JANELLE:あなたは異なるものを入力しました。 DAVID J.マラン:その通りです。 あなたは、異なるものを入力しました。 かしこまりました。 だから、拍手、 ここで、私たちができれば。 [拍手] それは苦痛だった。 私は知っている。 うまく行って。 だから今私たちができない場合を見てみましょう 修正が何であったか離れていじめる。 そしてもちろん、私たちはthis--固定時 その私が今green--で表します 私たちはここでの機能強化のカップルをやった。 まず、ただ正気など 私が最初にチェックしています、確認してください sがヌルに等しく、tはヌルに等しい場合。 とき可能性があり、単に、明確にするために Sまたはtがこのようなコードにnullになる? ときにSまたはtがnullになる可能性があります。 うん? 聴衆:[聞こえない]。 DAVID J.マラン:その通りです。 文字列、ユーザーがその場合は に入力された道が長すぎる メモリに収まら、またはいくつかのように そのような奇妙なコーナーケース、 私たちは文字通り、わかりますように、のgetString 今日、そのドキュメントの、 それはのようにnullを返しますと言う 特別なセンチネル値、 特殊記号のか、単に並べ替え それは、何かが間違っていたことを意味します。 だからかどうかを確認したい 結局のところので、その そのnullは非常に危険な値です。 多くの場合、あなたが何かをしようとした場合 ヌルを渡しfunction--が関与 入力として、その機能をinstance--ため 非常にそれで、クラッシュします可能性があり、 あなたのプログラム全体をダウンさせる。 だから今この三行はただ正気です あなたがする場合は、エラーチェックをチェックしてください。 それは今のところ良い習慣だ 私たちは、いつに入るため、私たち その値を使用しようとする 、潜在的に、nullになる可能性があります。 さて、ここでは4行目の、 「もし関数strcmp(s、t)は、「よく、 を参照していることは何ですか? さて、私たちは、これは非常に簡潔に述べた 文字列比較のために指定された関数。 そして、生活の中で、その目的は、比較することである 第二、それに対するその最初の引数、 はなく、それらのアドレスの面で、 私たちは一瞬意図せずに行ったように 前の赤のコードではなく むしろこれら二つを比較する 人間の直感的な内の文字列 このに対して、これを比較することにより、道、 このに対して、このに対して、および その後停止時に1 ifと 私の指の一方または両方 バックスラッシュ0を打つ。 だから、誰かが数年前にstrcmpを実施 私たちのための機能を実装する 私たちが得ていることを望んだこと ちょうど2つの単純な値を比較することによって。 今率直に言って、私は図面を保つ これらのさまざまな数字がすべて表示されます。 しかし、現実には、私がしてきた、ある ずっとこれらを構成する。 だから私はちょうど先に行くみましょう これらを走り書き 、最後にポイントを作るために 一日のと前進、 私たちは本当に気にするつもりはない 何が物事が実際にアドレス メモリ内の。 だから私は、これらを描画するつもりはない もうそんなに数字の種類、 私は離れて、この単なる抽象的なんだ ちょうど矢印でもう少し優しい。 言い換えると、sがポインタである場合、 よく、ちょうど文字通り、それを描画しましょう​​、 ポインタとして、矢印が指している 自身から何か他のものに、 とについてはあまり多くを心配しないで これらのアドレスの特徴点 これは、もう一度、私はとにかく占めた。 しかし、私たちはそれらのアドレスが表示されます、 時には、コードをデバッグするとき。 さて一方、このプログラム ここまでの修正はもちろん、 比較することにより、その問題 これら二つの文字列。 しかし、私たちは別の問題に遭遇した。 これはコピーからでした プログラム最後の時間、 それによって、私は大文字にしようとしていた 文字列内のちょうど最初の文字。 しかし、症状は何だった 私たちは時に最後の時間を見た 値で入力したユーザーなど sの小文字ゲイブ、、 その後私たちは、Tへの割り当て そこに3行目のように、 そしてその後私はしみました Tブラケット0を大文字? の効果は何だったの ここで、Tブラケット0を変える? 聴衆:それは、sを変更しました。 DAVID J.マラン:ええ、 私も、秒を変更しました。 本当に何が起こっていたかのため? まあ、私はきれいにすることができるなら、私に見てみましょう この写真をアップする、以下のように。 sがある場合は、再度、単語g、 A、B、E、バックスラッシュ、0、およびs 私たちはボックスとして描画を続けます ここでは、ないより多くのアドレス。 それでは物事を構成するやめよう。 ちょうど絵を描いてみ 世界を単純化することができます。 私は、文字列tとtと宣言すると、 それは、メモリのチャンクを作成します。 広場は32であることを起こる ほとんどのコンピュータのビット。 実際には、もしあなたがこれまで聞いた コンピュータは、32ビットアーキテクチャを有する 本当に空想話を、ちょうどその それは32ビットのアドレスを使用することを意味します。 そして余談技術的として、 あなたは今まで疑問に思ってしまった場合 なぜ古いコンピュータ、実際にあなたの場合 RAMの多くが付いているスープにそれらをしようとした、 唯一の最大値を持つことができ RAMが4ギガバイトの、 よくそれは文字通り、あるためですが、 古いコンピュータができる唯一の 4という高い数える 億円、40億バイト、 それは、32ビットを使用していたので、 アドレスには数字。 しかし、いずれの場合にも、この中 たとえば、話はずっと簡単だ。 tはちょうど別のポインタである、または 本当にチャースター、別名文字列。 そして、どのように私はこの写真を更新しますか 今のコードの二行目で、 ドットの後、ドット、ドット? 私は文字列を行うとtは、sのセミコロンに等しい この絵はどのように変化するのでしょうか? うん? 聴衆:[聞こえない]。 DAVID J.マラン:うん。 その通り。 私はちょうどから矢を入れる 同じアドレスに対するTボックス、 の同じ最初の文字があった。 あるいは、技術的には、もしこの 男は、0x1のでまだあった 私が持っていたかのようにです こことここに0x1の0x1の。 しかし、再び、誰が気に アドレスはどうですか? それは今重要なのばかり考えです。 だから、これは、ここで何が起こっているかである。 もちろん、それで、あなたがtブラケットを行う場合 配列表記で0、 のcourse--と率直に言って、それが見えます こっちに配列がありますように、 しかし今、この奇妙なことがあります。 そのプログラミング言語を知っている、 Cは、あなたにこの機能を提供しています、 これにより、tがあっても ポインタ、またはsは、ポインタである あなたはまだ、そのおなじみを使用することができます 快適な角括弧 表記法は、最初の要素に移動し、 第二の要素、または任意の要素または そのポインタが指していることを それ、おそらく、理由に この場合のように、ある いくつかの配列を指して。 では、どのようにこれを修正しますか? それが持ってどこに率直に言って、これは 一見少し圧倒。 しかし、ここで新しく改良されたバージョンです。 したがって、最初、私が得ている CS50ライブラリを取り除く、 ただ、実際にそれがよさ露出させる char型のスター、ちょうど同義語。 そしてTはまた、char型の星である。 しかし、上で何が起こっているのか その行の右側 tが値を割り当てられる場合、? malloc関数とは何ですか? それが何をstrlenをだ? はsizeof(char型)とは何ですか? なぜ一体これを行います ラインは非常に複雑に見える? それは、高いレベルで何をしているのですか? それがtでの保管は何ですか? うん? 聴衆:それは割り当てることだ メモリ空間の一定量。 それは私が推測する、保存するための、 手紙[聞き取れない]。 DAVID J.マラン:パーフェクト。 パーフェクト。 それは、特定の配分だ メモリ空間の量 おそらく、将来の文字を格納する。 特に、malloc関数 したがって、何を返している? 聴衆:[聞こえない]を返す? DAVID J.マラン:その通りです。 そのメモリのアドレスを返す、 これというのがファンシーな方法ですが、 のアドレスを返す そのメモリの最初のバイト。 責任は覚えて私にある どのくらいのメモリI実際に 割り当てられたかのためのmallocを求めた。 今ではどれくらいですか? まあ、ありますにもかかわらず、 ここで、括弧の多くは、 malloc関数はただ一つの引数を取ります。 そして、私は、sのstrlen関数を指定して、そのように得られています 私のバイト数秒であるように、 が、1つを追加します。 なぜ? うん? 聴衆:バックスラッシュ0。 DAVID J.マラン:その通りです。 私たちは、少し家事を行うようになってきました。 だから、バックスラッシュがありますので、 0、私たちはより良いことを覚えていると思います。 そうでなければ、私たちはつもりだ その文字列を作成するには その特別なターミネータを持っていません。 一方、ちょうどスーパーであると 肛門は、私は、はsizeof(char型)がある 念のため、誰かが私を実行します CS50アプライアンス上のコードではない、 多分別のコンピュータ 完全に文字 慣例により、1バイトですが、2 バイト、またはそれよりも大きなもの。 それはちょうど、スーパーであることだが、 エラーにスーパー嫌う。 にもかかわらず、実際には、それがだ 最も可能性の高い1になるだろう。 さて、一方、私が先に行くと、コピー 文字列は、Tブラケットiは、Tブラケットsです。 そして、私は先週のに延期します ソースコードは、何が起こっているかを確認します。 しかし、キー持ち帰り、および 理由は、私は、緑の中で、今のコードを入れて 、まさにその最後の行からです Tブラケット0は、TOUPPER等しい の効果を有する 活用している文字列? tおよび/またはs? コー​​ドの最後の行。 ただ何ので、トン 今回起こった、 私は少しその最後のステップを元に戻す場合には、 何が起こったのは、私がmalloc関数を呼び出すときに、ある、 私は基本的にメモリのチャンクを取得 それは、オリジナルと同じサイズである、 なぜならそれは私がやった算術だ。 私はアドレスTに格納しています メモリのチャンクの。 これは良さそうに見えていても と、かなりいいとブランク、 現実は私たちがよ、ありますされている ここで、呼び出しごみ値を保持します。 メモリのチャンクは非常に可能性がある よく前に使用されてきたが、 数秒、数分前。 だから、絶対に数字があるかもしれません またはそこには、文字、ちょうど偶然。 しかし、彼らは私になる​​まで、有効ではありません 私自身は、このメモリのチャンクを読み込む 私のような実際の文字、と そこに、forループという点で行います。 すべての権利? だから今、のクライマックス これらの三つの例 それは、一見、前回破壊した このスワップの例は、この関数 感覚で働いていた それはaとbが入れ替わっていること。 しかし、それは他のどのような意味では機能しませんでした? うん? 聴衆:[聞こえない]。 DAVID J.マラン:その通りです。 私は、この関数を呼び出すとしたら 例えばanother--から、 ここで、メインのような関数から 私は、私のように、変数、xとyを持っている 先週やった、同じコード、 と私は、xとyを渡す 交換し、次にSwap--これを呼び出すには、 もちろん、正しいバージョンである 私たちがしようとしているものです see--それはうまくいきませんでした。 だから修正は何ですか? まあ、これだけであることが 明確な、私は先に行ってみよう and--ここに私に1秒を与え、参照してください。 私はあなたに最後の1を表示することができれば、どの 私が見つけることができるかどうかを見てみましょうin--になります この本物のfast-- OK、[聞こえない]。 [OK]を、そこにそれがある。 だから私はちょうど入力しているコマンドを無視。 私はそれがで取得したい 土壇場の例 前回から、どの 今はスワップと呼ばれていません。 だから何スワップ場所はありません 私たちは、前回中断した それによって、私は初期化さ 2対1であり、yからx。 私は、1と2を渡して、スワップを呼び出します。 そして、この機能 ある意味で働いていた、 それは永久にありませんでした xとyへの影響。 だから手元に質問がどのように今、ある 私たちは実際にこの問題を解決するのですか? 手元の解決策は何ですか? さて、今日は新しく追加されましたswap.c、中、 相違点がいくつかに気づく。 xおよびyは同じである。 しかし、何が明らかに 25行程度違うのですか? あなたが覚えていれば、そこに新機能 それは第二の前にように見えたもの? 聴衆:[聞こえない]。 DAVID J.マラン:うん。 だから、アンパサンドは、新しい作品である このプログラムだけでなく構文、 だけでなく、より一般的にはCS50中。 現在までに、私は考えていない 私たちはどんな例を見てきました あるいは本当にいずれかでそれらについて話しました 多分、プリエンプティブ以外の細部、 セクションで、このようなアンパサンド。 まあ、それはアンパサンドが1つであるが判明 新しい構文の最後の作品の 私たちは学ぶつもりです。 その意味すべてがある いくつかの変数のアドレス。 どのアドレスでxが住んでいますか? しかし、yがどのアドレスを生きるのですか? ので、もし 前の基本的な問題 xとyが渡されていたということでした 私たちが本当にやりたいことのコピーなど 宝などでスワップを提供している 実際にここで、xとyにつながるマップ ように、RAM内にある スワップそのマップに従うことができます そしてxまたはyがスポットをマークどこに行く そして実際の値1と2を変更する そこ。 だから、スワップも若干変更する必要があります。 そして、一見、この全力 char型の星に少し似ているようだ。 そして実際、それはある。 だから、データの型へのポインタである、 このハイライトされた部分に基づいて? だから、int型です。 だから、もはやint型ではない、 それはint型のアドレスです。 同様に、bが今起こっている int型のアドレスである。 だから私は、今のメインのスワップを呼び出すときに、 私はスワップ1と2を与えるつもりはない。 私のようにそれを与えるつもりだ オックス代や牛、何か、 つながる二つのアドレス 彼らの実際の場所へのスワップ 私のコンピュータのメモリに。 だから今、私の残りの実装 少しを変更する必要がある。 何が今明らかに違う 次の3行のコードでの? これらすべてのいまいましいの星があります 場所の上、大丈夫? それでは、ここで起こっている? うん? 聴衆:それは[聞こえない]明らかだ。 DAVID J.マラン:その通りです。 したがって、このcontext--で、これはありませんでした 最高のデザインの決定、確かに、 何年も前 この文脈において、 あなただけの星を持っている、 あなたがデータ型を持っていない、 int型のような、すぐに左に、 代わりに、あなたは明確に、等号を持っている、 この文脈では、あなたが言うときスター、 それはに行くことを意味 内のアドレス。 いわば、宝の地図に従ってください。 そして一方で、37行中、 それは同じことを意味します。 アドレスaに移動し、そこに何を入れる? にあるものは何でも bが指定された場所。 つまり、Bに移動します。 その値を取得します。 に移動し、同じあたり サインインして代入演算子、 そこにその値を置く。 同様に、int型の一時だけのintです。 何も一時について変更する必要はありません。 それはアネンバーグからわずかスペアガラスです いくつかの牛乳やオレンジジュースのために。 しかし、私は言ってBに行く必要があります。 その宛先に移動し、 そこに一時に値を入れる。 それでは、何が起こっているか? 私は実際にスワップ今回を呼び出すと、もし ここで、この第一のトレーメインを表し、 この第二のトレイがスワップを表し、時 私はアンパサンドxとyのアンパサンドを渡す メインからわずか明確にすることが、交換すること、 このスタックフレームの受信は何ですか? うん? 聴衆:[聞こえない]。 DAVID J.マラン:その通りです。 xとyのアドレスのアドレス。 そして、あなたはこれらを考えることができます 郵便のアドレスのよう。 33オックスフォードストリートと35 オックスフォード·ストリート、そしてあなた 二つの建物を移動したい これらの場所にあること。 それはばかげたアイデアのようなものだ、 それは私たちが、アドレスの意味すべてです。 どこの世界ですることができます あなたはこれらの2つのintを見つける? どこの世界であなたができる これら二つの建物を見つける? 私はすべてのこの時間後に、最終的にはそうであれば 今日のソースコードにアクセスし、コンパイル スワップおよび実行./swap、最終的には、用 初めて私たちは実際にそれを見ていますか 私の値は、実際に持っている 成功裏にスワップさ。 そして今、私たちも取ることができます この中で、たとえば、GDBをメモ。 だから私は、同じファイルに行きましょう。 私が先に行くと./swapのGDBを実行してみましょう。 そして今、スワップに、私は行くつもりです 先にメインにブレークポイントを設定します。 そして今、私は行くつもりです 先に、プログラムを実行します。 そして今、私たちは私のコードを参照してください その行で一時停止。 私が先に行くと、印刷した場合 xが、私はここで何が表示されるはずです? それは問題だ。 もう一度言って? 聴衆:[聞こえない]。 DAVID J.マラン:だから 乱数、多分。 たぶん私は幸運を得る、それはだ 0のような、素敵でシンプル。 しかし、おそらくそれはいくつかの乱数です。 この場合、私は幸運。 それはちょうど0であることを起こる。 しかし、それは確かに幸運であり、 ではない私まで、理由 次の入力し、印刷xがあることがあります コー​​ドの行、19行は、実行された。 一方、私は再び次の入力した場合、および 今のyをプリントアウトし、私は2を見に行くよ。 私は、次の入力した場合さて、それはに起こっている 今ので、少し混乱するかもしれない、 printfのは上の表示されるように起こっている それがなかったような画面、。 xは1である。 それでは、もう一度、これをやってみましょう。 そして今、ここにどこだ 物事は面白く。 私は、スワップ、あるいはステップを呼び出す前に、 その中に、のはちょっと覗いてみましょう。 xは、再び、1である。 Yは、もちろん、迅速な健全である そこにハード、チェック2、そうではない。 しかし、アンパサンドxは何ですか? 回答、それは一種のファンキー探しています。 しかし、カッコ内のintスターだけです これを言ってのGDPの方法がアドレスです。 それは、それはへのポインタint型ですないです int型、またはその他のアドレスとも呼ばれます。 このクレイジーなことは何ですか? 私たちは、何かを見たことがない かなり前にそのような。 だから、これは私のコンピュータの内のアドレスです xが生きるために起こる場所のメモリ。 それは、牛、何か。 そして、これは率直に言って、なぜ、ある 私は、矢印を描き始めましたが、 数値の代わりに、 誰が本当に気に理由 あなたの整数、特にであることを 大きなことだアドレス。 しかしbffff0c4、これらが全てです 確かに16進数、 fを0からである。 だから私たちはあまりにも住むつもりはない それらのものが何であるかの長い。 しかし、私は、Yをプリントアウトした場合、 もちろん、私は2を参照してください。 しかし、アンパサンドyは、私がこのアドレスを参照してください。 そして、好奇心のために、注意してください どれだけ離れて、xおよびyは? あなたは、アドレスのほとんどを無視することができます。 4バイト。 そして、それは私たちと一致してい 以前のint型どの大きさであることを主張? 4バイト。 だから、すべてのもののライニングアップのように見える きれいに、あなたは、メモリ内に、願っています可能性があるため。 だから今、ちょうど早送りしてみましょう この物語の最後に。 それでは先に行くとステップを入力してみましょう、 スワップ機能に飛び込むする。 今私は入力した場合、それはだ、気づく xのアドレスと同じ。 私はBを入力すると、それは同じだ yのアドレスへ。 私のであれば、私は何が表示されるはずです 、アドレスに行くと言う? だから、スタープリントする。 だから星はこのコンテキストでは、そこに行くことを意味します。 アンパサンドのアドレスに何を意味します。 だから手段1スター。 そして、プリントスターのbは私に2を提供します。 そして、私は一瞬、と仮定しましょう​​、 少なくともコードということ することができ、今、実行に移行する そのように通って推論した。 しかし、私たちはずっと前にこのアイデアを再検討します。 スワップのため、このバージョン 今正しく、ことができます 私たちは、この特定のデータ型を交換する。 だから、ご質問、次にスワップについて? スターオン? のアドレスに? そして、あなたはして、表示​​されます 問題は、一種の、4セット が、問題は、どのようにこれらの間違いなく、5を設定 物事は有用であり、多くを得る 結果として、彼らと快適。 まったく何? かしこまりました。 だからmalloc関数は、再び、この機能で それはちょうど、メモリ、メモリを割り当て 配分。 そして、なぜこれが便利なのですか? さて、すべてのこの時間、 あなたはmalloc関数を使用してきた。 あなたは今どのように考えると 作品をgetStringで、おそらく、それはだ のチャンクの誰かを求めて メモリ、いつでもユーザーの種類の文字列 中、確かに私たちのため CS50のスタッフとして、知りませんでした、 どのように大きなその人間これらの文字列 かもしれないと入力しようとしている。 それでは、最初に、に始めましょう ピールバック方法CS50ライブラリ作品、 例をいくつ経由で それはそこに私たちをリードします。 だから私はgeditのを開く場合は、 そして、scanfの0を開く 私たちは、次のコードを参照してくださいとしている。 のためのウェブサイト上で利用可能なscanf関数0、 今日、比較的少ない行数のコードを持って ここでは、20を経て14。 そして、のは、それがやっているか見てみましょう。 それは、int型と呼ばれるのxを宣言しています。 それは数下さい、のようなものを言います。 そして今、それはscanf関数の%I、&X、と言います。 だから、そこに新しいものの束があります。 しかし、scanf関数は、一種の考えることができます のprintfの反対としての。 printfのはもちろん、画面に出力します。 ユーザーのからのスキャンのscanf関数の並べ替え 彼または彼女がタイプしたキーボードの何か。 %iはちょうどprintfのようなものです。 これは期待する意味 ユーザーは、int型を入力します。 そして今、なぜあなたは私が思いますか scanfの&Xを渡すかもしれない? scanf関数の生活の中で目的の場合 ユーザーから何かを得ることです、 の意味は何ですか 今、それを渡し、&X? うん? 聴衆:[聞こえない]。 DAVID J.マラン:その通りです。 どのような私は、人間は、私の入力を入力 その場所に保存されようとしている。 それはちょうどに、十分な、リコールではありません 私たちはすでに見てきたので、Xを渡し、 いつでもあなたは、単なる生変数を渡す int型のような、いくつかの他の機能に、 確かに、それはそれを変更することができます 変数ではなく、永久に。 それは、メインに影響を与えることはできません。 それだけで、独自のローカルコピーを変更することができます。 しかし、もし、その代わりに、あなたはしないでください 私に実際のint型を与え、 しかし、あなたは私に指示を与える そのint型、今、scanf関数であること、 確かに、私はそれに従うことができます 対処し、そこに番号を入れる そうあなたにもそれにアクセスすることができます。 私はこのプログラムを実行するときに、見てみましょう。 scanfの0ドットスラッシュ、scanf関数0にしてください。 そして、私は今番号を入力した場合 50のおかげで、50等である。 私は今のように数値を入力した場合 負の1のために、1負。 私は今、HM、1.5のように数値を入力します。 なぜ私のプログラムは私を無視したのですか? さて、という理由だけで、私は言った それだけのintを期待する。 かしこまりました。 だから、これのバージョンは1つです。 のノッチ物事を見てみましょうと これは良くないことを提案する。 そして、ここに非常に簡単な例がある 私たちは、コードを書き始める方法の 他の人が利用することができますか 悪いことを行うことで妥協。 だからライン16、非常に似て 前に精神で、 私はそれが今回はint型の宣言ではないよ。 私はそれを文字列別名char型星を、宣言しています。 しかし、それは本当に何を意味するのでしょうか? だから私はaddress--を指定しない場合と 私は、任意のバッファを、それを呼んでいる、 しかし、私はあること、だ、それを呼び出すことができsimple-- そして、私は、これを行う私に説明、 あなたは以前に基づいて、できれば ロジック、scanfの18行目に何をしているか、 パス%sは、バッファであれば、 アドレスはありますか? あなたが適用される場合、scanf関数とは何ですか バージョン0と全く同じロジック、 と、ここで行うようにしようとするつもり ユーザーの種類の中で何か? うん? 聴衆:[聞こえない]。 DAVID J.マラン:その通りです。 scanf関数、ロジック以前のことで、 文字列を取るつもりされている 人間が入力したことを 、それが今の文字列ですin-- それは、おそらく、数ではありません 彼または彼女はcooperates--た場合 そしてそれはそれを置くことを試みるために起こっている どのようなアドレスのメモリ内の文字列 バッファが指定されます。 そして、これは、素晴らしいですバッファ理由 実際のアドレスであることを意味する。 しかし、私はこのプログラムはにバグが主張 非常に深刻な方法、どのような値であるため、 デフォルトでは、バッファ? 私は何をしに初期化した? メモリのどのチャンク? 私が持っていないでしょ? だから私は、割り当てられたにも関わらず、 もはやSと呼ばれていたcharスター、 それは代わりに呼ばれていますので、buffer-- それでは、変数の名前を描いてみましょう 私が持っていない場合は、今のようにbuffer-- ここでは、getStringまたはmalloc関数と呼ばれ、 その効果的にことを意味します バッファは、単にいくつかのごみ値です。 今では何を意味するのでしょうか? それは私がscanf関数に言ったことを意味します ユーザーから文字列を期待する。 そして、あなたは何を知っていますか? 何でもこの事を指している to--と私は疑問符を描き、 実際には、それはなるだろう OX1、2、3、のようなものでしょ? これは、いくつかの偽の値だということだけで 以前からそこにあることを起こる。 だから、別の言い方を、それはだ バッファはちょうどであるかのように メモリ内の何かを指している。 私は何か分からない。 私は今、ゲイブに入力した場合だから、それは起こっている そこのg-B-E / 0を入れて試してみる。 しかし、誰がそれが何であるかを知っている? そして、過去に、いずれかの 私たちが触れないようにしようとした時 属していないメモリ 私たちに、何が起こったの? またはほぼ毎回。 セグメンテーションフォルト、右か? この矢印は、私はそれがだか分からない ポインティング。それだけでいくつかのランダムな値です。 そしてもちろん、あなたが解釈した場合 アドレスとしてランダム値、 あなたがに行くつもりです いくつかのランダムな目的地。 だから、ゲイブクラッシュ確かかもしれない ここで、この場合の私のプログラム。 だから私たちはそれがほぼ同じ悪い何ができますか? この第三を検討し、 scanf関数の最後の例。 このバージョンでは、どのような意味で良いですか? あなたが慣れている場合は 前の問題は、これが優れている。 なぜ? 聴衆:[聞こえない]。 DAVID J.マラン:良い。 ライン16のしたがって、この場合 ある意味で、優れている 私たちは、明示的にしていることを いくつかのメモリを割り当てる。 私たちは、malloc関数を使用していない 私たちは週に2使用している ただ配列を宣言するアプローチ。 そして、私たちは、その文字列の前に言った 文字だけの配列です、 これは完全に正当なものである。 しかし、それはのように、当然のことながら、だ あなたは、固定サイズ、16の点に注意してください。 したがって、このプログラムです 私が入力した場合、完全に安全 1文字の文字列では、2つの文字 文字列、15文字の文字列。 しかし、すぐに、私は16をタイプし始めると、 17、18 1,000文字列、 どこにその文字列が終わるつもりですか? これは、一部はここに終わるだろう。 しかし、その後、誰が他に何を知っている 境界を超えている この特定の配列の? 私がしたかのようなものだ ここに16のボックスを宣言した。 したがって、すべての16を引き出すのではなく、私たちはよ ちょうど私が16を描いたことふりをする。 しかし、私は、文字列を読み取るしようとした場合 これは50文字のように、はるかに長いですが、 私は置く作業を開始するつもりだ A、B、C、D、x、y、zの。 そして、これはおそらくです 他のいくつかのメモリ·セグメント それは、再び、発生する可能性があり クラッシュする私のプログラム、 私はを求めていませんでしたので、 ちょうど16バイト以上のもの。 だから、誰が気に? さて、ここでCS50ライブラリです。 そして、これのほとんどはちょうどです トップアップの指示などである。 CS50ライブラリ、すべてのこの時間、 52行で、この行を持っています。 私たちは、typedefを見たり、き あなたはtypedefで表示されます ちょうど作成のpset 4、内 char型の星はもっとすることができる同義語 単に文字列と呼ばれる。 だから、これはの一つである いくつかの補助輪 私たちは、フードの下に密かに使用しました。 一方、ここにgetchar関数です。 さて、明らかに、それへのボディはありません。 そして、実際に、私が続ければ スクロール、私は実際にない いずれの実装を参照してください。 これらの関数の。 健全性チェックとして、それはなぜでしょうか? 聴衆:[聞こえない]。 DAVID J.マラン:うん。 だから、これはヘッダファイルです。 そして、ヘッダファイルには、プロトタイプが含まれている、 プラスいくつかの他のもの、それが思われる、 のtypedefのような。 しかし、私たちがしたCS50.c、中 あからさまなあなたに与えられたことはありません、 しかし、すべてのCS50アプライアンスにされている 今回は、そのフォルダの奥深く、 全体があることに気付く ここでの関数の束。 実際には、のは下にスクロールしてみましょう。 それでは、今のところ、それらのほとんどを無視しましょう​​。 しかしgetIntはまでスクロールし そしてgetIntは動作を確認。 だからここgetIntはです。 あなたが本当に気にした場合、どのように取得する int型は、ここで、機能し、そのマニュアルである。 そしてとりわけ、 それはそれはあなたを伝えていると言う 何それが返すことができる値の範囲。 それは本質的に負の20億 正の20億に、与えるか、または取る。 そしてそれは、このすべてが判明 時間は、私たちは初めてだなくても あなたがそれをチェックしていた、 何かがうまくいかない場合には、 それはすべてのことが判明した 今回は、getIntはがあります 特別なを返すされてい 、ヌル、一定ではない むしろある、INT_MAX ただプログラマの大会。 なお、ここで意味特別な値です。 ただ、これをチェックしてください 場合には、何かがうまくいかない。 しかし、私たちは気にしたことがない これまでのものと、 再び、このため 簡略化することを意味する。 しかし、どのようにgetIntはが実装されるのですか? さて、人は、それは引数を取りません。 私たちはそれを知っている。 これは、intを返します。 私たちはそれを知っている。 それでは、どのようそれはボンネットの下に動作しますか? だから、明らかに無限あります ループ、一方の​​少なくとも外観。 私たちはにgetStringを使用していることに注意してください。 だから面白い。 getIntは 私たち自身の機能、のgetStringを呼び出します。 そして今、なぜこのような場合でしょうか? なぜ私は守備されるのです ここで、ライン165内の? どのようなラインで発生する可能性があります 164、ちょうど明確にするには? これは、前と同じ答えだ。 ただメモリが不足かもしれません。 何かがのgetStringで問題が発生した、 私たちはそれを扱うことができるようになってきました。 そして、私がnullを返さない理由は、 それは、技術的には、ヌルポインタである。 getIntはint型を返すことがあります。 だから私は任意にしました 基本的に、決定した、 、20億、与えるか、または取ることが起こっている 私は決してできる特殊な値になるように 実際にユーザから得る。 それは私が行くよただ一つの値だ エラーコードを表現するために無駄にする。 だから今、物事は少し空想を取得します。 そして、それは全く同じ機能ではありません 以前のように、それは非常に似ています。 だから私はラインで、ここに宣言し、注意してください 172、int型のn及びチャーCの両方。 そして私は、このファンキーな行を使用し、 結局のところsscanfは、 キーボードから文字列をスキャンしません。 これは、既存の文字列を立って、その ユーザーは、すでに入力した。 だから私はすでに、これにgetStringと呼ばれる 私はメモリ内の文字列があることを意味します。 sscanfはは何をしたいです 解析関数を呼び出します。 それは私がした文字列を見て 、文字ごとに入力した 有用な何かをする。 その文字列は行に格納されます。 そして、私は唯一で行くことを知っている [OK]を、ああ、ここと言ってバックアップし、 私は、s今回はそれをしないと呼ばれるが、ライン。 そして今、これは少し異なります。 しかし、これは効果的理由のために、手段 私たちは、多少、今日の私たちの手を振るよ 私達はにチェックしていることを ユーザーが入力したかどうかを確認 とint型と、おそらく別の文字。 ユーザーがintで入力した場合、それはだ 私はだから、n個に格納される予定 アドレスで、これを渡し、 私たちが今日見てきた新しいトリック。 また、ユーザは、入力した場合 123X等では、そのX 結局しようとしている 文字cの文字。 今ではそのsscanfは判明 インテリジェントに、私に教えてくれます、 sscanfはどのように多くの変数があった 埋めることに成功できる。 このロジックによる、もしそうであれば、関数 私が実装している場合、getIntあり、 私がチェックしています、 潜在的に、利用者のための int型に型指定されていると 何か他のものに続いて、 私は、sscanfは年代何をしたいですか 戻り値は真になりますか? 目的は、取得している場合 ユーザーからわずかint型? もしそうであればsscanfは戻ります 2、それは何を意味するのでしょうか? ユーザーが入力した内 何かのように、文字通り、 意味がない123X、。 これは、エラー状態だし、 私はそれをチェックしたいと思います。 だから、これでユーザータイプの場合、バイ このロジック、返すSSCANF何、 あなたは言うでしょうか? だから、あるため、2を返すために起こっている 123はここに行くために起こっている、 xは、ここで終了する予定です。 しかし、私は、xがいっぱいにする必要はありません。 私だけで成功するためにはsscanfしたい その変数の最初の充填。 だからそれが理由です、私 sscanfは1を返したい。 そして、これは少し頭を超えている場合 一瞬、それは全く問題ありません。 しかしのその1を実現 getIntはとのgetStringの値 私たちはの一体をやっているということです したがって、このようなエラーチェックがたくさん その、これまでに、あなたはかなりすることができます あなたのキーボードから何も入力し、 そして私たちはそれをキャッチします。 そして、私たちは確か、 スタッフは、間違いなくしません あなたのバグの原因になる 私たちは守備だからプログラム、 愚かなのすべてをチェックする ユーザーが行う可能性があります事、 文字列を入力と同様に、時 あなたは本当にint型を望んでいた。 だから私たちは来るnow--用 戻ってこれまでlong--前 しかしすべてのこの時間、 のgetStringやgetIntはを持っている これを使用して、ボンネットの下にあった メモリのアドレスの基本的な考え方。 だから今、Aの物事を作ってみよう もう少しユーザーフレンドリー。 あなたはBinky最後から、思い出してたよう time--私のマウスはそうcooperate--する場合 私たちは、このコードを持っていた 率直に言って、かなり無意味である。 このコードは何も達成していない 有用な、しかしそれは一例であっ その教授Parlante 表すために使用さ 何がで起こっていた メモリに関連するプログラム。 それでは、これを再び語るましょう 物語超簡単に。 これらの最初の二行で 英語では、あなたは何を言うでしょうか? ただ合理的人間が、 少し技術的な用語は、刺しを取る。 聴衆:[聞こえない]。 DAVID J.マラン:OK、あなたが確立している あなたのxとyの変数のアドレス。 かなり、xおよびyはないためではない 伝統的な意味での変数。 xおよびyはアドレスである またはアドレスを格納します。 それでは、もう一度、これを試してみましょう。 悪くないスタート、しかし。 うん? 聴衆:[聞こえない]。 DAVID J.マラン:良い。 私は少しクリーナーだと思う。 二つのポインタ、2つの整数を宣言。 そして、私たちは彼らに、xとyを呼んでいる。 それともならば描画する この絵のような、再び、 非常に単純にそのすべてを思い出す 私たちは、その最初の行でやっている このような箱を集めている、 その中にいくつかのごみ値で、 してからxを呼び出して、 このような別のボックス、 いくつかのごみ値で その中に、yのそれを呼び出す。 私たちは、2宣言した ポインタその究極的 int型のアドレスを格納します。 だから、すべてあります。 Binkyはこれをしなかったので、とき、 粘土はちょうどこのように見えた。 そして、ニックだけの種類 矢印を終え、 彼らはどこにも向いていないかのように 特に、彼らはただだから ごみ値。 彼らは明示的に初期化していない 特にどこでも。 の今すぐ次の行 コー​​ド、リコールは、このでした。 、合理的にユーザーフレンドリーで非常に やや技術的な英語、 コー​​ドすることのこのラインは何ですか? うん? 聴衆:[聞こえない]。 DAVID J.マラン:パーフェクト。 それは、のチャンクを割り当てるだ int型のサイズであるメモリ。 そして、それは半分の答​​えだ。 あなたは正しい答え 式の半分。 何で何が起こっている 等号の左側? うん? 聴衆:および譲受人 、それを変数xに? DAVID J.マラン:そして割り当て それを変数xに。 要約、右側の割り当てにそう int型を格納するのに十分なメモリ。 しかし、malloc関数、具体的 アドレスを返す あなたがしたメモリのチャンクの ただ、提案のxに格納されます。 それでは、ニックはBinkyで前回やったことはある 彼はそのポインタをドラッグし、粘土、 メモリの白いチャンクで今指すように それは、int型のサイズと同じである。 そして実際、それは意味だ 4バイトを表します。 コー​​ドのさて、次の行 これをした、スターのxが42を取得します。 だから42が上に簡単です 右側、人生の意味。 左側、スターのxが何を意味する? それは大丈夫ですgone--それも可能性があります。 [OK]をクリックします。 聴衆:基本的には、 [聞き取れない]に移動します DAVID J.マラン:良い。 聴衆:[聞こえない]。 DAVID J.マラン:その通りです。 左辺は、xに行くことを意味します。 xはアドレスです。 それは、33オックスフォードストリート、またはOX1のようなものだ。 そして、スターのxはそれに行くことを意味 アドレスとそこに何を入れる? 42。 だから確かに、それはニックはまったく同じものです。 彼は、ことで始まり 基本的に、精神的に 指でのポインティング 矢印以下のx、 右側の白いボックスに 側、そしてそこに数42を置く。 しかし、その後のことが得た 少し危険な、右か? Binkyの頭を失うことについての。 スターyは何を意味し、13、不運に等しい? だから、スターのyの手段がyのアドレスにアクセスしてください。 しかし、yのアドレスは何ですか? すべての権利、それが正しい、ガベージ値ですか? 私は疑問符としてそれを描きました。 ニックは丸くなっ矢印として描きました。 そして、できるだけ早くあなたがしようとして そこに行くと言って、スターyを行い、 しかし、正当ではありません アドレスは、いくつかの偽の立地、 プログラムがクラッシュするだろう。 そして、Binkyの頭が起こっている それがなかったように、ここに飛んでいる。 このプログラムは、最終的にはそう ちょうど平らな傷だった。 これは、バグのあるプログラムでした。 そして、それは修正される必要がありました。 そして、唯一の方法は、実際に、それを修正するために 例えば、このラインになり、 私たちもに到達しなかった、なぜなら プログラムは、あまりにも早く墜落した。 しかし、私たちはこれを修正した場合、どのような 効果をyに等しいxは持ってやっていますか? まあ、それは本質的でyを指す どのような値xで指している。 だから、ニックの物語の中で、 両方またはBinkyの話、 xおよびyは指し示すた メモリの白チャンク、 その結果、最終的に、ときに yが再び13になりスターんが、 あなたは13に入れてしまう 適切な場所。 したがって、これらのラインの全てが完璧です これを除いて、正当な、 それはあなたの前に起こったとき 実際にyのいくつかの値が割り当てられています。 さて、ありがたいことに、はしないでください すべてを通して推論する必要があります ご自身での問題、これらの種類の。 私が先に行くと開いてみましょう ここでターミナルウィンドウまで とちょっと、開く、 スーパーショートプログラムもの また、ソートの無意味です。 それは醜いです。 それは便利な何かを達成しない。 しかし、それは問題を示さない メモリが、それでは見てみましょう。 超簡単、メイン。 これは、明らかに関数を呼び出し、 fは、その後、0を返します。 それは台無しこれまでに種のは難しい。 だから主は、これまでのところ、かなり良いです。 それでfは問題である。 そして、ちょうど多くを入れていない それに名前を付けるに努力 ここでは、コードにフォーカスを維持する。 fは2つの行を持っています。 そして今度は、何が起こっているのか見てみましょう。 だから、一方では here--と私は作ってみよう 以前、この一貫性のある 、一方ではexample-- 左側は 英語で、何をやって? それはis-- 聴衆:ポインタを作成します。 DAVID J.マラン:ポインタの作成 int型であり、Xと呼ん。 だから、これらのボックスのいずれかを作成することだ 私は、タッチスクリーン上に描画し続ける。 そして今、右手上 側、malloc関数はもちろん、 メモリのチャンクを割り当てて。 そして、ちょうど明確にすることが、どのように 多くのメモリは、明らかにそれである ちょうどあなたと、割り当てる 種類のここで計算を行う? だから、40バイトです。 そして、私は私が知っているという理由だけであることを知っている int型、CS50アプライアンス上、少なくとも、 4バイトです。 だから、10回4は40です。 だから、これは、X、アドレスを記憶している その40 intのうち最初の バックスペースを割り当てられている、 、背中合わせにするために、バックアップする。 そして、それはmalloc関数に関する重要だものだ。 これは、少ないメモリを取りません ここでは、ここで少し、少しここに。 それはあなたのメモリの一塊を与え、 連続して、営業から システム。 今、この約何、 Xブラケット10は0に等しい? コー​​ドの任意の行。 それは便利な何かを達成しない。 しかし、それは面白いです、 Xブラケット10--理由? うん? 聴衆:[聞き取れない]? DAVID J.マラン:Xブラケット 10はNULLである必要はありません。 ヌルディテールだけで場に出る 文字列を持つ、文字列の末尾に。 しかし、よく考えて。 この配列はさらに、どのように大きいです 私は、40バイトが割り当てられてきたものの? それは右、9 0〜ですか? それは10のint、合計です。 40バイトが、10 int型、 0 0からインデックス付き。 だからのxブラケット10は何ですか? それは実際にいくつかの 未知のごみ値。 それは私に属していないメモリです。 私はあることに触れすべきではない バイト数は41、42、43、44。 私はあまりにも遠く少しつもりです。 そして実際、私はこれを実行した場合 プログラムは、それは非常によくクラッシュする可能性があります。 しかし、時には、私たちは幸運取得します。 そして、これだけ実証する this--と率直に言って、 あなたがあなたの前に知っていることはありません それでは、これを実行してみましょうit--ください。 それは実際にクラッシュしていない。 しかし、私はこれを変更した場合、用 インスタンスは、1000のようになるために 本当にこれを作る 意図的な、見てみましょう 私たちは、この時間をクラッシュさせる得ることができます。 [OK]を、それがクラッシュしていない。 どのように約100,000? のは、それをリメイクしましょう​​、そして今それを再実行します。 [OK]をクリックします。 あー。 かしこまりました。 そこで明らかに、再び、これらの いわばメモリのセグメント、 私たちはできる、合理的に大きいです 何度も何度も幸運を得る。 しかし、最終的には、一度あなたがばかげ取得 本当に、画面上で遠くに出かける あなたは、本当にメモリに触れる 本当にあなたに属していません。 しかし、率直に言って、これらの バグの種類がしようとしている 難しくなるように 自分で把握できます。 しかし、ありがたいことに、プログラマのように、私たちは持っている 私たちは私たちのためにこれを行うためのツール。 だから、これは、おそらく、一つです 醜いのプログラム、 GDBの出力よりもさらに醜い。 しかし、それは常に行を持つか 超便利2アール。 Valgrindのは役立つプログラムです あなたがプログラムをデバッグしない、それ自体、 が、メモリ関連の発見 問題は、具体的に。 それは自動的にあなたのコードを実行します あなたと、少なくとも2つのものを探す。 一方、あなたが何かをしましたか タッチメモリのような偶発 それはあなたに属していたのですか? それはあなたがこれらのケースを見つけましょう。 そして2、それが役立つ あなたはと呼ばれるものを見つける 私たちが持っているメモリリーク、 完全に無視、単純に、 しばらくして穏やか。 しかし、それはすべて、判明 今回は、いつでも あなたはgetStringメソッドで呼び出されました 私たちのプログラムのように多くの、 あなたは営業を求めている メモリのためのシステム、 しかし、あなたはどんな思い出を持っている 今までそれを与える 背中、UNALLOCをやったり、 自由、それは呼ばれるように。 いいえ、私たちは初めてだしないため、 そうするように頼んだ。 しかし、すべてのこの時間、プログラム あなたがC言語で書いてきた メモリリークされてきた、 運転を求めて より多くのためのシステム 文字列やその他もろもろのためのメモリ、 が、それをバック渡すことはありません。 そして今、これは少しある 単純化の、 しかし、あなたがあなたのMacまたはを実行してしまった場合 かなりの時間、開放のためにPC プログラムの多く、 多分、プログラムを終了 とにもかかわらず、あなたの コンピュータがクラッシュしていない、 それは、そんなに遅いなってきた それは本当にだかのように 大量のメモリを使用するか、 リソース、たとえ、 あなたもいないのであれば キーボードに触れ、 それはalways--なかっbe--が、できませんでした あなたが実行しているプログラムのことである それ自体がメモリリークを持っている。 そして、彼らはますますのOSを求めておく より多くのメモリが、それを忘れ、 実際に、それを使用していないが、 したがって、離れてメモリを取って それをする可能性のある他のプログラムから。 だから、一般的な説明です。 今ここにどこValgrindの者です 出力は完全に 少ないものに凶悪な 同様に、より快適。 しかし、興味深いの スタッフはここまでです。 それは私の無効な書き込みを語っている サイズ4は、このプログラムに起こる 特に、のmemory.cの21行で。 私はHM、そこに確かに、21行目に移動した場合 サイズ4の無効な書き込みである。 なぜサイズ4? さて、このnumber--、それ intでanything--である可能性があります。 だから、4バイトです。 だから私は、4バイトを入れている どこに属していない。 それはどのようなValgrindのだ 実際に私に言っている。 さらに、それはまた、意志 私たちが見るよう、私に教えて、 あなたがあれば、将来のpsetでこれを実行するようにし、 あなたが実際にメモリをリークしてきたとき 私が呼んでいるので、私は、持っている malloc関数が、私は実際には持っていない フリー、この場合には、いわゆる その私たちが最終的に表示されます malloc関数の逆です。 だから今、私は、最後の例だと思います。 したがって、この1はもう少しだ 難解な、そ​​れはおそらくです への最大の理由 メモリに注意して、 そして理由は、多くのプログラム および/またはWebサーバも、この日に、 どこかで悪者に引き継がれている 何とかあるインターネット上の サーバーに偽のパケットを送信する あなたのアカウントを侵害しようとすると、 またはちょうどあなたのデータを取るか、 一般的にマシンを引き継ぐ。 バッファオーバーフローなど 名前は、手段を示唆している ではないのintが、バッファのオーバーフロー。 そして、バッファは変わった方法である それはメモリの束だと言っている。 そして実際、私は、文字列と呼ばれる バッファの前に、代わりにsの。 それはバッファの場合にはそのため、 YouTubeの意味でのように、 またはビデオを監視していますいつでも、 あなたが単語のバッファリングを見たかもしれない、 ドットドットドット。 それは信じられないほど迷惑なんだ。 そして、それはただの手段 そのあなたのビデオプレーヤー 多くをダウンロードしようとしている バイト、バイトの多くの インターネットからのビデオから。 しかし、それは遅いですので、それはしようとしている それらの束をダウンロードする その結果、バッファ、コンテナを埋めるために あなたはそのことが次にでき十分なバイトを持つ あなたのビデオを表示、 常に一時停止せずに。 しかし、それはあなたができる、判明 この大きなバッファを持っています。 しかし、この多くのデータを配置しよう それは、非常に悪いことが起こる可能性があります。 例えばそれでは、見てみましょう 例のこの最後のティーザー。 これは、別のプログラムであり、 その、一見、 超便利何もしない。 これは、主な機能を持っている それをf、その関数を呼び出します。 そして、その関数は、fは、ここまで、あります サイズ12のCと呼ばれる文字配列、、。 その後、これを使っている 新しい関数はstrncpyを呼ばれる。 それは、この単純で、ことが判明 コー​​ドの単純な線、わずか2行、 私たちは、私の全体のプログラムを行っている そのため、私の全体のコンピュータ、 と私のユーザーアカウント、および私のハード 誰にも潜在的に脆弱ドライブ 誰が知っているし、実行するのに十分に良好である 特定のコマンドラインでこのプログラム 引数。 換言すれば、この悪いやつ 次のように入力してargvargv [1]の中に入れます 非常に特別な細工がされたキーボードで 文字列ではなく、ABC、123、しかし本質的に、 実行可​​能ファイルを表すバイナリシンボル コー​​ド、彼または彼女が書いたプログラムを、 で、この単純なプログラムと プログラムの何千人もの代表 、あえて言う同様に脆弱であること、 彼または彼女は最終的にすべてを削除することができます 私のハードドライブ上のファイルは、取得 彼または彼女ができるように、プロンプトを点滅 自分でコマンドを入力し、 自分自身にすべてのファイルを電子メールで送信。 私が何かできることは、彼 または彼女は、このコードで行うことができます。 私たちは、非常にまだこれを解決することはできません。 そして、実際に、それはに起こっている 小さな画像を伴う このように、私たちはすぐに来るよこれ すべてをよりよく理解する。 しかし、今日のために、の上で終わらせて うまくいけば何の、やや 理解できるXKCDジョーク、 私たちは次の時間を再開するまで。 かしこまりました。 水曜日にお会いしましょう​​。 [音楽再生] スピーカー:そして今、深い 祈るファーナムによる思考、。 メモリがの山に飛び込むようなものです 日曜日の午後に金色の葉。 風あなたを投げ、吹い ああhair--、私は日when--欠場 [笑い]