Placeholder Image

字幕表 動画を再生する

  • [MUSIC PLAYING]

    [音楽再生]

  • >> DAVID J. MALAN: All right.

    >> DAVID J.マラン:すべての権利。

  • This is CS50.

    これはCS50である。

  • And this is the start of week 5.

    そして、これは週5の開始である。

  • And as you may have noticed, some of the material

    そして、あなたは気づいている可能性がある、 材料の一部

  • is getting a little more complex, the little denser.

    もう少しを得ている 複雑な、少しより高密度。

  • >> And it's very easy, especially if you've been in the habit for some time,

    >> そして、それは、特に場合、非常に簡単です あなたは、いくつかの時間を習慣にしてきた

  • to be trying to scribble down most anything we do, we're saying in class.

    ほとんどのダウン走り書きしようとしているように 私たちは何でも、私達はクラスで言っている。

  • But realize, that is not perhaps the ideal pedagogical approach

    しかし、それはおそらくありませんが、実現 理想的な教育学的アプローチ

  • to learning this kind of material, and material more generally.

    この種の材料を学ぶために、 材料より一般的。

  • And so we are pleased to announce that CS50's own Gheng

    そして、私たちはして満足している そのCS50自身Ghengを発表

  • Gong has begun to prepare a canonical set of notes

    ゴングが準備を始めている ノートの標準的なセット

  • for the course, the hope of which is that, one, these

    コー​​スの希望 これは、これらは、その一つである

  • not only serve as a reference and a resource

    だけでなく、として機能 リファレンスとリソース

  • for reviewing material and going back through material that might have

    材料の見直しや行くため バックかもしれない材料を通る

  • escaped you the first time around, but also so that your heads can be more

    あなたの最初の頃を免れたが、 また、ヘッドはもっとできるように

  • up than down, when it comes time to lecture,

    ダウン、ときにそれをよりアップ 講義を時間が来る、

  • so that you might engage more thoughtfully, as

    あなたが従事する可能性がありますように もっと思慮深く、として

  • opposed to more scribbly.

    もっとscribblyに反対。

  • >> With that said, what you'll find on the website is such documents as this.

    >> ということで、あなたは何を見つける ウェブサイトは、このようなドキュメントである。

  • And notice, at top left, there's not only a table of contents,

    そして、通知は、左上にある、あります 目次だけではなく、

  • but also time codes that will immediately jump you

    だけでなく、タイムコード、その すぐにジャンプします

  • to the appropriate part in the video online.

    適切な部分へ ビデオオンラインでの。

  • And what Chang here has done is, essentially, documented

    そしてここでチャンは何を行っている 、本質的に、文書化されています

  • what happened in this particular lecture.

    この中で何が起こった 特定の講義。

  • And many of the lectures are already online now with this URL.

    そして、講義の多くは、 すでにオンライン今、このURLに置き換えてください。

  • And we'll continue to post the remainder of those by the end of this week,

    そして私達は残りを掲載していきます 今週の終わりまでにそれらの、

  • so do take advantage of that resource.

    その結果、リソースを活用します。

  • >> So without further ado, we started to peel back

    >> だから、前置きなしに、 私たちは戻って剥離し始めた

  • the layer that has been string for some time.

    されている層 しばらくの文字列。

  • And what did we say a string actually is last week?

    そして、私たちは、文字列を何と言った 実際に先週は何ですか?

  • So char star.

    だからチャースター。

  • And char star, well, what did that really mean?

    チャースター、よく、どのような それは本当に意味した?

  • Well, all this time, if we've been calling a function,

    さて、このすべての時間、私たちはしている場合 関数を呼び出すされて、

  • like getString, and storing the so-called return

    のgetStringと、記憶などの いわゆるリターン

  • value of getString in a variable-- it's called

    内のgetStringの値 それは呼ばれていますvariable--

  • s type string-- we've been writing the line of code up there above.

    私たちが書いてきたstring-- Sタイプ そこまで上記のコードの行。

  • And it's only when I see my handwriting magnified here

    私は私を見ると、それが唯一だ ここに拡大された手書き

  • do I realize just how atrocious this is.

    私はこれがいかに凶悪な理解ください。

  • >> However, let's assume that, on the right-hand side

    >> しかし、のはそれを想定してみましょう、 右側に

  • is, nonetheless, a reasonable depiction of what's

    、それにもかかわらず、合理的である 何の描写

  • been going on all this time with getString.

    このすべてに起こって のgetStringと時間。

  • getString, of course, gets a string.

    のgetStringは、もちろん、文字列を取得します。

  • But what does that really mean?

    しかし、それは本当に何を意味するのでしょうか?

  • It means it gets a chunk of memory from the operating system

    それはのチャンクを取得します意味 オペレーティング·システムからメモリ

  • by calling a function, called malloc.

    関数を呼び出すことで、malloc関数と呼ばれる。

  • But more on that later.

    しかし、もっとその上で後で。

  • And then it populates that chunk of memory

    そしてそれは移入 メモリのチャンク

  • with the letters the user has typed in, followed by, of course,

    ユーザーが持っている文字で もちろん、続いて、タイプ入力

  • a null character, or backslash zero at the very end.

    null文字、またはバックスラッシュ 最後の最後でゼロ。

  • >> Meanwhile, on the left-hand side of this story, all this time,

    >> 一方、左側の この物語の、すべてのこの時間、

  • we've been declaring a variable, like s.

    私たちは、sのように、変数を宣言してきた。

  • And that variable is what now will start calling a pointer.

    そして、その変数は今何をしている ポインタを呼び出して起動します。

  • It's not a box inside of which we put the string, Daven, per se,

    それは、その内部のボックスではありません 私たちは、文字列を入れて、祈る、それ自体が、

  • but rather we put in that square box on the left what exactly?

    むしろ私たちは、その広場に置く まさに左側のボックス?

  • Yeah?

    うん?

  • >> AUDIENCE: The address of where it's located in memory.

    >> 聴衆:のアドレス どこにそれがメモリ内に位置し。

  • >> DAVID J. MALAN: Exactly.

    >> DAVID J.マラン:その通りです。

  • The address of where Daven is located in memory.

    祈るのアドレス メモリ内に位置しています。

  • And not where all of Daven is located, per se, but specifically the address

    そして、ここで祈るのすべてが配置されていない、 それ自体が、特にアドレス

  • of what?

    何の?

  • Yeah?

    うん?

  • >> AUDIENCE: First character.

    >> 聴衆:最初の文字。

  • >> DAVID J. MALAN: The first character in Daven, which, in this case,

    >> DAVID J.マラン:最初の文字 この場合には祈る、中、

  • I proposed was arbitrarily and unrealistically 1, Ox1,

    私は任意だっ提案 そして非現実1、OX1、

  • which just means the hexadecimal number of 1.

    これだけのことを意味 1の16進数の数。

  • But it's probably going to be a much bigger number

    しかし、それはおそらく起こっている はるかに大きな数であるように

  • that we might draw with a 0x as a prefix,

    私たちは引く可能性があることを 接頭辞として0xを、

  • representing a hexadecimal character.

    16進文字を表す。

  • And because we don't need to know where the rest of the characters of Daven

    そして、私たちはどこに知っている必要はありませんので、 祈るの文字の残りの部分

  • are, because of what simple design decision that was made many years ago?

    なぜならどんなシンプルなデザインで、ある 何年も前に作られた決断?

  • Yeah?

    うん?

  • >> AUDIENCE: Backslash 0.

    >> 聴衆:バックスラッシュ0。

  • DAVID J. MALAN: Yeah, exactly.

    DAVID J.マラン:ええ、その通りです。

  • The backslash 0 allows you, albeit in linear time, to traverse the string,

    バックスラッシュ0ではあるが、あなたを可能にする 文字列を横断する線形時間、、

  • walk from left to right, with a for loop, or a while

    左から右に歩いて、 forループ、またはwhileと

  • loop, or something like that, and determine, oh, here

    ループ、またはのようなもの それは、ここで、ああ、決定する

  • is the end of this particular string.

    この特定の文字列の終端である。

  • So with just the address at the beginning of a string,

    でちょうどアドレスを持つので、 文字列の先頭、

  • we can access the entirety of it, because all this while,

    私たちは全体にアクセスすることができます それは、すべてのこの間のため、

  • a string has just been a char star.

    文字列はただのcharスターでした。

  • >> So it's certainly fine to continue using the CS50 library and this abstraction,

    >> だから、継続して使用することが確かにいいのよ CS50ライブラリと、この抽象化、

  • so to speak, but we'll begin to see exactly

    いわば、私たちはよする 正確に見始める

  • what's been going on underneath this whole time.

    何が起こっているされています この全体の時間の下に。

  • So you may recall this example, too, from last time, compare 0,

    だから、この例を思い出すことができ、 あまりにも、前回から、0を比較し、

  • which didn't actually compare.

    これ実際に比較しませんでした。

  • But we began to solve this.

    しかし、私たちはこれを解決し始めた。

  • >> But as perhaps a refresher, might I interest someone

    >> しかし、として、おそらくリフレッシュ、 私は誰かは興味があります

  • in a pink elephant today, also made by Chang?

    ピンクのゾウ、今日、 また、チャンによる?

  • How about you in front? [INAUDIBLE].

    どのように前のあなたは? [聞き取れない]。

  • Come on up.

    アップさあ。

  • >> And in the meantime, as you come up, let's

    >> そして、その間に、 あなたが出てくるように、してみましょう

  • consider for just a moment what this code was actually doing.

    ちょっと考えるもの このコードは、実際にやっていた。

  • It's declaring two variables up top, s and t, and calling getString.

    これは、2つの変数を宣言しています トップ、sとtとのgetStringを呼び出す。

  • This isn't a very user-friendly program, because it doesn't tell you what to do.

    これは、非常にユーザーフレンドリープログラムではありません それはあなたを教えていないため、何をすべきか。

  • But let's just assume we're focusing on the juicy part.

    しかし、ちょうど私たちがしていると仮定しましょう ジューシーな部分に焦点を当てた。

  • And then we do, if s equals equals t, it should say printf,

    sが等しい場合と、私たちは、何 Tに等しく、それはprintfの言う必要があり、

  • you typed the same thing.

    あなたが同じことを入力しました。

  • Hello.

    こんにちは。

  • What's your name?

    あなたの名前は?

  • >> JANELLE: Janelle.

    >> JANELLE:ジャネル。

  • DAVID J. MALAN: Janelle, nice to meet you.

    DAVID J.マラン:ジャネル、 よろしくね。

  • So your challenge at hand for this elephant

    であなたの課題は、そう このゾウのための手

  • is to first draw us a picture of what's being represented in those first two

    最初の私たちに何の絵を描画することです これらの最初の二つで表現されている

  • lines.

    ライン。

  • So s and t might be represented how on the screen?

    だから、sとtは次のようになります。 どのようにスクリーン上に表現?

  • And you can just draw it with your finger on this big screen.

    そして、あなたはただでそれを描くことができます この大画面上で指。

  • >> So there's two halves to each side of that equation.

    >> だから、二つの半分にはありませ その方程式の各側面。

  • So there's s on the left, and then getString on the right.

    だから、左のsはそこだし、 その後、右側にのgetString。

  • And then there's t on the left, and then getString on the right.

    そしてtは、左側にあります そして、右側ののgetString。

  • So how might we begin drawing a picture that

    では、どのように始めるかもしれません その絵を描く

  • represents what's going on here in memory, would you say?

    何が起こっているかを表す ここでは、メモリに、あなたは言うでしょうか?

  • And let me let you explain what you're doing as you go.

    そして、私はあなたが説明させてみましょう あなたが行くように、あなたは何をやっている。

  • >> JANELLE: OK.

    >> JANELLE:わかりました。

  • Well, first, it would be asking you to get the input string.

    さて、最初に、それは尋ねることになる あなたが入力文字列を取得します。

  • And it would store-- oh, sorry.

    そして、それは申し訳ありませんが、ああstore--だろう。

  • DAVID J. MALAN: OK.

    DAVID J.マラン:わかりました。

  • Good.

    グッド。

  • And this is called what?

    そして、これは何と呼ばれている?

  • Oh, OK.

    [OK]を、ああ。

  • Keep going.

    続ける。

  • I didn't mean to interrupt.

    私は、中断することを意味するものではありませんでした。

  • JANELLE: Sorry.

    JANELLE:申し訳ありません。

  • So it would input it into the address of-- not sure.

    だから、に入力してだろう アドレスがわからないof--。

  • I can't exactly remember the number, but I believe it was starting with 0.

    私は正確に番号を覚えていないことができ、 私はそれは0から始まると考えていました。

  • >> DAVID J. MALAN: That's all right, because I made the numbers up,

    >> DAVID J.マラン:それはすべての権利は​​、 私は数字を作ったので、

  • so there's no right answer.

    そう何正しい答えはありません。

  • >> JANELLE: Starting with the 0 arc.

    >> JANELLE:0アークで開始。

  • >> DAVID J. MALAN: OK, so element 0.

    >> DAVID J.マラン:そう、要素0。

  • Sure.

    かしこまりました。

  • >> JANELLE: And then if was like just a two-letter--

    >> JANELLE:そしてあったか ちょうど二letter--様

  • >> DAVID J. MALAN: OK, back to you.

    >> DAVID J.マラン:OK、あなたに戻って。

  • >> JANELLE: So element 0, and then element 1 or element 2.

    >> JANELLE:だから要素0、および その後エレメント1またはエレメント2。

  • DAVID J. MALAN: And which piece of the picture are you drawing right now?

    その作品のそして:DAVID J.マラン 写真は、あなたが今、描いていますか?

  • The call to getString?

    のgetStringへの呼び出し?

  • Or the declaration of s?

    またはsの宣言?

  • >> JANELLE: The declaration of s, I believe.

    >> JANELLE:宣言 Sの、私は信じています。

  • Oh, the getString, because it would be inputted into each [? area. ?]

    ああ、getStringで、それはなるため 各【に入力する?エリア。 ?]

  • >> DAVID J. MALAN: Good.

    >> DAVID J.マラン:良い。

  • Exactly.

    その通り。

  • Even though this effectively returns an array, recall,

    効果的なのに、この 配列、リコールを返し、

  • when we get back a string, we can index into that string using 01 and 2.

    私たちは、文字列を取り戻すとき、私たちはすることができます 01および2を使用して、その文字列のインデックス。

  • Technically, these are probably represented by individual addresses,

    技術的には、これらは、おそらくです 個別のアドレスによって表される、

  • but that's fine.

    それはいいのよ。

  • >> So suppose, if I can just fast forward to where we left off

    >> 私はちょうど速くできればそう、とします 私たちは中断したところに転送

  • last time, if one of the strings was g a b e,

    前回、1の場合 文字列は、B型電子gであった

  • backslash 0, thereby representing gabe's input, how might we represent s now?

    それによって、ゲイブ年代を代表するバックスラッシュ0、 入力は、どのように私たちは今のを表しているのでしょうか?

  • If this is the memory that's been returned by getString?

    これのメモリがある場合 のgetStringにより返されていますか?

  • >> JANELLE: Would it be represented by an arc?

    >> JANELLE:それは次のようになります アークが表す?

  • >> DAVID J. MALAN: By an arc?

    >> DAVID J.マラン:アークによって?

  • Well, no.

    いや、まあ。

  • Let's just say, pictorially, let me just go ahead

    ちょうど絵で、としましょう​​、 私はちょうど先に行きましょう

  • and propose that, if this is s, this is the return value of getString.

    これはsである場合、このことを提案 のgetStringの戻り値です。

  • And you've drawn this as 0, 1, 2, which is perfectly reasonable, because we

    そして、あなたはその、0、1、2として、これを描いた われわれので、完全に合理的である

  • can index into the string, as such.

    のような文字列のインデックス、することができます。

  • But just to be consistent with last time, let me go ahead

    しかし、単にと一致しているように 前回、私が先に行かせて

  • and arbitrarily propose that this is address 1, this is address 2,

    任意このことを提案する アドレス1であり、これがアドレス2であり、

  • this is address 3, and so forth.

    これ等アドレス3、及びである。

  • And so, just to be super clear, what's going

    だから、ちょうどスーパーであると 明確な、何が起こっている

  • to go in s as a result of that first line of code, would you say?

    その結果として、年代に行くために コー​​ドの最初の行には、と思いますか?

  • >> JANELLE: Address 1?

    >> JANELLE:住所1?

  • >> DAVID J. MALAN: Exactly.

    >> DAVID J.マラン:その通りです。

  • So address 0x1.

    だから、0x1の対処。

  • And meanwhile, let me go ahead and duplicate much of what you've done

    そしてその間、私が先に行くとしましょう あなたがやったことの多くを複製

  • and add my own t here.

    そして、ここで私自身のトンを追加します。

  • If I were to type in gabe again, a second time,

    私はゲイブを入力した場合 再び、二度目、

  • when prompted with getString, where, of course, is gabe going to go?

    のgetStringでメッセージが表示されたら、どこで、 もちろん、ゲイブは行くつもりですか?

  • Well, presumably--

    さて、presumably--

  • >> JANELLE: Like on here?

    >> JANELLE:ここでの、気に入りましたか?

  • DAVID J. MALAN: Yeah.

    DAVID J.マラン:うん。

  • JANELLE: Or it's also in the same boxes?

    JANELLE:それとも同じ箱にもですか?

  • DAVID J. MALAN: Let me propose, yeah, exactly, so in these additional boxes.

    DAVID J.マラン:ええ、私は提案してみましょう、 正確には、これらの追加のボックスにそう。

  • But what's key now is that, even though I've drawn these pretty close

    しかし、今の鍵なのはあっても、ということです 私はこれらの非常に近くに描いていますが

  • together-- 0x1, this is 0x2-- in reality,

    0x1のtogether--、この 実際に0x2--され、

  • this now might be address 0x10, for instance, and 0x11, and 0x12,

    これは現在、アドレス0x10のかもしれない 例えば、および0x11を、と0x12の、

  • and so forth.

    など。

  • And so, if that's the case, what's going to end up here in t?

    ですから、そのような場合、 何トンで、ここで終わるために起こっている?

  • >> JANELLE: 0x10?

    >> JANELLE:0x10を?

  • DAVID J. MALAN: Exactly.

    DAVID J.マラン:その通りです。

  • So 0x10.

    だから、0x10を。

  • And so now, final question.

    だから、今、最後の質問。

  • You have, by far, had to work the hardest for an elephant thus far.

    あなたは、はるかに、仕事を持っていた これまでゾウのための最も難しい。

  • By now, if I pull up the code again, when I do, in line three,

    今では、私は、コードをプルアップした場合 再び、私が行うとき、ライン3において、

  • if s equals equals t, what am I actually comparing that we've drawn here?

    sがtと等しい等しい場合、私は実際に何をしてい ここで描かれたことと比較する?

  • >> JANELLE: The two addresses?

    >> JANELLE:二つのアドレス?

  • DAVID J. MALAN: Exactly.

    DAVID J.マラン:その通りです。

  • So I'm saying is s equal equal to t?

    だから私は、tに等しい等しくSで言っている?

  • In other words, is 1 equal equal to 10?

    言い換えると、1〜10に等しい等しい?

  • And of course, the obvious answer now is, no.

    そしてもちろん、 明白な答えは今ありません、です。

  • And so this program is ultimately going to print what, would you say?

    だからこのプログラムは最終的にある 何を印刷しようとして、あなたは言うでしょうか?

  • >> JANELLE: Would it be, you typed the same thing?

    >> JANELLE:それは次のようになり、 あなたが同じことを入力した?

  • >> DAVID J. MALAN: So if s is 1 and t is 10?

    >> DAVID J.マラン:もしそうであれば sが1であり、tは10である?

  • >> JANELLE: You typed different things.

    >> JANELLE:あなたは異なるものを入力しました。

  • >> DAVID J. MALAN: Exactly.

    >> DAVID J.マラン:その通りです。

  • You typed different things.

    あなたは、異なるものを入力しました。

  • All right.

    かしこまりました。

  • So a round of applause, if we could, here.

    だから、拍手、 ここで、私たちができれば。

  • [APPLAUSE]

    [拍手]

  • That was painful.

    それは苦痛だった。

  • I know.

    私は知っている。

  • Nicely done.

    うまく行って。

  • So now let's see if we can't tease apart what the fix was.

    だから今私たちができない場合を見てみましょう 修正が何であったか離れていじめる。

  • And of course, when we fixed this-- which I'll now represent in green--

    そしてもちろん、私たちはthis--固定時 その私が今green--で表します

  • we did a couple of enhancements here.

    私たちはここでの機能強化のカップルをやった。

  • First, just as a sanity check, I'm first checking

    まず、ただ正気など 私が最初にチェックしています、確認してください

  • if s equals null and t equals null.

    sがヌルに等しく、tはヌルに等しい場合。

  • And just to be clear, when might s or t be null in code like this?

    とき可能性があり、単に、明確にするために Sまたはtがこのようなコードにnullになる?

  • When might s or t be null.

    ときにSまたはtがnullになる可能性があります。

  • Yeah?

    うん?

  • >> AUDIENCE: [INAUDIBLE].

    >> 聴衆:[聞こえない]。

  • >> DAVID J. MALAN: Exactly.

    >> DAVID J.マラン:その通りです。

  • If the string that the user typed in is way too long

    文字列、ユーザーがその場合は に入力された道が長すぎる

  • to fit into memory, or some weird corner case like that,

    メモリに収まら、またはいくつかのように そのような奇妙なコーナーケース、

  • getString, as we'll see, literally today, in its documentation,

    私たちは文字通り、わかりますように、のgetString 今日、そのドキュメントの、

  • says it will return null as a special sentinel value,

    それはのようにnullを返しますと言う 特別なセンチネル値、

  • or just sort of a special symbol that means something went wrong.

    特殊記号のか、単に並べ替え それは、何かが間違っていたことを意味します。

  • So we want to check for that, because it turns out

    だからかどうかを確認したい 結局のところので、その

  • that null is a very dangerous value.

    そのnullは非常に危険な値です。

  • >> Often, if you try to do something with null involving a function-- passing it

    >> 多くの場合、あなたが何かをしようとした場合 ヌルを渡しfunction--が関与

  • as input, for instance-- that function might very will crash and, with it,

    入力として、その機能をinstance--ため 非常にそれで、クラッシュします可能性があり、

  • take down your whole program.

    あなたのプログラム全体をダウンさせる。

  • So this third line now is just a sanity check, error checking, if you will.

    だから今この三行はただ正気です あなたがする場合は、エラーチェックをチェックしてください。

  • That's a good habit now for us to get into any time we

    それは今のところ良い習慣だ 私たちは、いつに入るため、私たち

  • try to use a value that could, potentially, be null.

    その値を使用しようとする 、潜在的に、nullになる可能性があります。

  • >> Now, in the fourth line here, "if strcmp(s, t)," well,

    >> さて、ここでは4行目の、 「もし関数strcmp(s、t)は、「よく、

  • what's that referring to?

    を参照していることは何ですか?

  • Well, we said this was a very succinctly named function for string comparison.

    さて、私たちは、これは非常に簡潔に述べた 文字列比較のために指定された関数。

  • And its purpose in life is to compare its first argument against it second,

    そして、生活の中で、その目的は、比較することである 第二、それに対するその最初の引数、

  • but not in terms of their addresses, as we did unintentionally a moment

    はなく、それらのアドレスの面で、 私たちは一瞬意図せずに行ったように

  • ago with the red code, but rather to compare those two

    前の赤のコードではなく むしろこれら二つを比較する

  • strings in the humanly intuitive way by comparing this, against this,

    人間の直感的な内の文字列 このに対して、これを比較することにより、道、

  • against this, against this, and then stopping if and when one

    このに対して、このに対して、および その後停止時に1 ifと

  • or both of my fingers hits a backslash 0.

    私の指の一方または両方 バックスラッシュ0を打つ。

  • So someone years ago implemented strcmp to implement for us the functionality

    だから、誰かが数年前にstrcmpを実施 私たちのための機能を実装する

  • that we hoped we would have gotten by just comparing two simple values.

    私たちが得ていることを望んだこと ちょうど2つの単純な値を比較することによって。

  • >> Now frankly, I keep drawing all of these various numbers.

    >> 今率直に言って、私は図面を保つ これらのさまざまな数字がすべて表示されます。

  • But the reality is, I've been making these up the whole time.

    しかし、現実には、私がしてきた、ある ずっとこれらを構成する。

  • And so let me just go ahead and scribble these out

    だから私はちょうど先に行くみましょう これらを走り書き

  • to make a point that, at the end of the day and moving forward,

    、最後にポイントを作るために 一日のと前進、

  • we're not really going to care about what addresses things are actually

    私たちは本当に気にするつもりはない 何が物事が実際にアドレス

  • in memory.

    メモリ内の。

  • So I'm not going to draw these kinds of numbers so much anymore,

    だから私は、これらを描画するつもりはない もうそんなに数字の種類、

  • I'm just an abstract this away a little more friendly with just arrows.

    私は離れて、この単なる抽象的なんだ ちょうど矢印でもう少し優しい。

  • >> In other words, if s is a pointer, well, let's just draw it, literally,

    >> 言い換えると、sがポインタである場合、 よく、ちょうど文字通り、それを描画しましょう​​、

  • as a pointer, an arrow pointing from itself to something else,

    ポインタとして、矢印が指している 自身から何か他のものに、

  • and not worry too much more about the minutia of these addresses

    とについてはあまり多くを心配しないで これらのアドレスの特徴点

  • which, again, I made up anyway.

    これは、もう一度、私はとにかく占めた。

  • But we'll see those addresses, sometimes, when debugging code.

    しかし、私たちはそれらのアドレスが表示されます、 時には、コードをデバッグするとき。

  • >> Now meanwhile, this program up here fixes, of course,

    >> さて一方、このプログラム ここまでの修正はもちろん、

  • that problem by comparing those two strings.

    比較することにより、その問題 これら二つの文字列。

  • But we ran into another problem.

    しかし、私たちは別の問題に遭遇した。

  • This was from the copy program last time,

    これはコピーからでした プログラム最後の時間、

  • whereby, I was trying to capitalize just the first character in a string.

    それによって、私は大文字にしようとしていた 文字列内のちょうど最初の文字。

  • But what was the symptom we saw last time when

    しかし、症状は何だった 私たちは時に最後の時間を見た

  • a user typed in a value, like gabe in lowercase, for s,

    値で入力したユーザーなど sの小文字ゲイブ、、

  • then we assigned s into t, as in the third line there,

    その後私たちは、Tへの割り当て そこに3行目のように、

  • and then I tried to capitalize t bracket 0?

    そしてその後私はしみました Tブラケット0を大文字?

  • What was the effect of changing t bracket 0 here?

    の効果は何だったの ここで、Tブラケット0を変える?

  • >> AUDIENCE: It changed s.

    >> 聴衆:それは、sを変更しました。

  • >> DAVID J. MALAN: Yeah, I changed s, as well.

    >> DAVID J.マラン:ええ、 私も、秒を変更しました。

  • Because what was really going on?

    本当に何が起こっていたかのため?

  • Well, let me see if I can clean up this picture, as follows.

    まあ、私はきれいにすることができるなら、私に見てみましょう この写真をアップする、以下のように。

  • >> If s is, again, the word g, a, b, e, backslash, 0, and s

    >> sがある場合は、再度、単語g、 A、B、E、バックスラッシュ、0、およびs

  • we'll continue drawing as a box here, but no more addresses.

    私たちはボックスとして描画を続けます ここでは、ないより多くのアドレス。

  • Let's stop making things up.

    それでは物事を構成するやめよう。

  • Let's just draw a picture to simplify the world.

    ちょうど絵を描いてみ 世界を単純化することができます。

  • >> When I declare t with string t, that creates that chunk of memory.

    >> 私は、文字列tとtと宣言すると、 それは、メモリのチャンクを作成します。

  • Square happens to be 32 bits in most computers.

    広場は32であることを起こる ほとんどのコンピュータのビット。

  • In fact, if you've ever heard of a computer having a 32-bit architecture,

    実際には、もしあなたがこれまで聞いた コンピュータは、32ビットアーキテクチャを有する

  • really fancy-speak, that just means it uses 32-bit addresses.

    本当に空想話を、ちょうどその それは32ビットのアドレスを使用することを意味します。

  • And as a technical aside, if you've ever wondered

    そして余談技術的として、 あなたは今まで疑問に思ってしまった場合

  • why older computers, if you actually tried to soup them up with lots of RAM,

    なぜ古いコンピュータ、実際にあなたの場合 RAMの多くが付いているスープにそれらをしようとした、

  • could only have a maximum of four gigabytes of RAM,

    唯一の最大値を持つことができ RAMが4ギガバイトの、

  • well that's because, literally, your old computer could only

    よくそれは文字通り、あるためですが、 古いコンピュータができる唯一の

  • count as high as 4 billion, 4 billion bytes,

    4という高い数える 億円、40億バイト、

  • because it was using 32-bit numbers for addresses.

    それは、32ビットを使用していたので、 アドレスには数字。

  • >> But in any case, in this example, story's much simpler.

    >> しかし、いずれの場合にも、この中 たとえば、話はずっと簡単だ。

  • t is just another pointer, or really a char star, aka string.

    tはちょうど別のポインタである、または 本当にチャースター、別名文字列。

  • And how do I want to update this picture now with that second line of code,

    そして、どのように私はこの写真を更新しますか 今のコードの二行目で、

  • after the dot, dot, dot?

    ドットの後、ドット、ドット?

  • When I do string t equals s semicolon, how does this picture change?

    私は文字列を行うとtは、sのセミコロンに等しい この絵はどのように変化するのでしょうか?

  • Yeah?

    うん?

  • >> AUDIENCE: [INAUDIBLE].

    >> 聴衆:[聞こえない]。

  • >> DAVID J. MALAN: Yeah.

    >> DAVID J.マラン:うん。

  • Exactly.

    その通り。

  • I just put an arrow from the t box to the same address,

    私はちょうどから矢を入れる 同じアドレスに対するTボックス、

  • the same first letter in gave.

    の同じ最初の文字があった。

  • Or technically, if this guy were still at 0x1,

    あるいは、技術的には、もしこの 男は、0x1のでまだあった

  • it's as though I had 0x1 here and 0x1 here.

    私が持っていたかのようにです こことここに0x1の0x1の。

  • But again, who cares about the addresses?

    しかし、再び、誰が気に アドレスはどうですか?

  • It's just the idea that now matters.

    それは今重要なのばかり考えです。

  • So this is what's happening here.

    だから、これは、ここで何が起こっているかである。

  • So of course, if you do t bracket 0, which is array notation,

    もちろん、それで、あなたがtブラケットを行う場合 配列表記で0、

  • of course-- and frankly, it looks like there's an array over here,

    のcourse--と率直に言って、それが見えます こっちに配列がありますように、

  • but now there's this weird thing.

    しかし今、この奇妙なことがあります。

  • Know that the programming language, C, offers you this feature,

    そのプログラミング言語を知っている、 Cは、あなたにこの機能を提供しています、

  • whereby, even if t is a pointer, or s is a pointer,

    これにより、tがあっても ポインタ、またはsは、ポインタである

  • you can still use that familiar, comfortable square bracket

    あなたはまだ、そのおなじみを使用することができます 快適な角括弧

  • notation to go to the first element, or the second element, or any element

    表記法は、最初の要素に移動し、 第二の要素、または任意の要素または

  • that that pointer is pointing to because, presumably, it

    そのポインタが指していることを それ、おそらく、理由に

  • is, as in this case, pointing at some array.

    この場合のように、ある いくつかの配列を指して。

  • >> So how do we fix this?

    >> では、どのようにこれを修正しますか?

  • Frankly, this is where it got a little overwhelming at first glance.

    それが持ってどこに率直に言って、これは 一見少し圧倒。

  • But here is a new and improved version.

    しかし、ここで新しく改良されたバージョンです。

  • >> So first, I'm getting rid of the CS50 library,

    >> したがって、最初、私が得ている CS50ライブラリを取り除く、

  • just to expose that s is indeed a char star, just a synonym.

    ただ、実際にそれがよさ露出させる char型のスター、ちょうど同義語。

  • And t is also a char star.

    そしてTはまた、char型の星である。

  • But what is going on on the right-hand side of that line

    しかし、上で何が起こっているのか その行の右側

  • where t is assigned a value?

    tが値を割り当てられる場合、?

  • >> What is malloc?

    >> malloc関数とは何ですか?

  • What it's strlen?

    それが何をstrlenをだ?

  • What is sizeof(char)?

    はsizeof(char型)とは何ですか?

  • Why the heck does this line look so complex?

    なぜ一体これを行います ラインは非常に複雑に見える?

  • What's it doing at a high level?

    それは、高いレベルで何をしているのですか?

  • What's it storing in t?

    それがtでの保管は何ですか?

  • Yeah?

    うん?

  • AUDIENCE: It's allocating a certain amount of memory space.

    聴衆:それは割り当てることだ メモリ空間の一定量。

  • It's to store, I guess, letters [INAUDIBLE].

    それは私が推測する、保存するための、 手紙[聞き取れない]。

  • >> DAVID J. MALAN: Perfect.

    >> DAVID J.マラン:パーフェクト。

  • Perfect.

    パーフェクト。

  • It's allocating a certain amount of memory space

    それは、特定の配分だ メモリ空間の量

  • to store, presumably, future letters.

    おそらく、将来の文字を格納する。

  • And in particular, malloc is therefore returning what?

    特に、malloc関数 したがって、何を返している?

  • >> AUDIENCE: Returning the [INAUDIBLE]?

    >> 聴衆:[聞こえない]を返す?

  • DAVID J. MALAN: Exactly.

    DAVID J.マラン:その通りです。

  • Returning the address of that memory, which is a fancy way of saying,

    そのメモリのアドレスを返す、 これというのがファンシーな方法ですが、

  • returns the address of the first byte of that memory.

    のアドレスを返す そのメモリの最初のバイト。

  • The onus is on me to remember how much memory I actually

    責任は覚えて私にある どのくらいのメモリI実際に

  • allocated or asked malloc for.

    割り当てられたかのためのmallocを求めた。

  • >> Now how much is that?

    >> 今ではどれくらいですか?

  • Well, even though there's a lot of parentheses here,

    まあ、ありますにもかかわらず、 ここで、括弧の多くは、

  • malloc takes just a single argument.

    malloc関数はただ一つの引数を取ります。

  • And I'm specifying strlen of s, so give me as many bytes as there are in s,

    そして、私は、sのstrlen関数を指定して、そのように得られています 私のバイト数秒であるように、

  • but add one.

    が、1つを追加します。

  • Why?

    なぜ?

  • Yeah?

    うん?

  • >> AUDIENCE: The backslash 0.

    >> 聴衆:バックスラッシュ0。

  • DAVID J. MALAN: Exactly.

    DAVID J.マラン:その通りです。

  • We've got to do a little housekeeping.

    私たちは、少し家事を行うようになってきました。

  • So because there's a backslash 0, we'd better remember that.

    だから、バックスラッシュがありますので、 0、私たちはより良いことを覚えていると思います。

  • Otherwise, we're going to create a string that

    そうでなければ、私たちはつもりだ その文字列を作成するには

  • doesn't have that special terminator.

    その特別なターミネータを持っていません。

  • >> Meanwhile, just to be super anal, I have sizeof(char),

    >> 一方、ちょうどスーパーであると 肛門は、私は、はsizeof(char型)がある

  • just in case someone runs my code not on the CS50 appliance,

    念のため、誰かが私を実行します CS50アプライアンス上のコードではない、

  • but maybe a different computer altogether where chars

    多分別のコンピュータ 完全に文字

  • are one byte, by convention, but two bytes, or something bigger than that.

    慣例により、1バイトですが、2 バイト、またはそれよりも大きなもの。

  • It's just to be super, super averse to errors.

    それはちょうど、スーパーであることだが、 エラーにスーパー嫌う。

  • Even though, in reality, it's most likely going to be a 1.

    にもかかわらず、実際には、それがだ 最も可能性の高い1になるだろう。

  • >> Now, meanwhile, I go ahead and copy the string, t bracket i equals t bracket s.

    >> さて、一方、私が先に行くと、コピー 文字列は、Tブラケットiは、Tブラケットsです。

  • And I will defer to last week's source code to see what's going on.

    そして、私は先週のに延期します ソースコードは、何が起こっているかを確認します。

  • But the key takeaway, and the reason I put the code now in green,

    しかし、キー持ち帰り、および 理由は、私は、緑の中で、今のコードを入れて

  • is because that very last line, t bracket 0 equals toupper,

    、まさにその最後の行からです Tブラケット0は、TOUPPER等しい

  • has the effect of capitalizing which string?

    の効果を有する 活用している文字列?

  • t and/or s?

    tおよび/またはs?

  • That last line of code.

    コー​​ドの最後の行。

  • >> Just t, because what's happened this time,

    >> ただ何ので、トン 今回起こった、

  • if I slightly undo that last step, what's happened is, when I call malloc,

    私は少しその最後のステップを元に戻す場合には、 何が起こったのは、私がmalloc関数を呼び出すときに、ある、

  • I essentially get a chunk of memory that is the same size as the original,

    私は基本的にメモリのチャンクを取得 それは、オリジナルと同じサイズである、

  • because that's the arithmetic I did.

    なぜならそれは私がやった算術だ。

  • I'm storing in t the address of that chunk of memory.

    私はアドレスTに格納しています メモリのチャンクの。

  • Even though this looks nice and pretty, nice and blank,

    これは良さそうに見えていても と、かなりいいとブランク、

  • the reality is there's, what we'll keep calling, garbage values in here.

    現実は私たちがよ、ありますされている ここで、呼び出しごみ値を保持します。

  • That chunk of memory might very well have been used before,

    メモリのチャンクは非常に可能性がある よく前に使用されてきたが、

  • a few seconds, a few minutes ago.

    数秒、数分前。

  • So there could absolutely be numbers or letters there, just by accident.

    だから、絶対に数字があるかもしれません またはそこには、文字、ちょうど偶然。

  • But they're not valid, until I myself populate this chunk of memory

    しかし、彼らは私になる​​まで、有効ではありません 私自身は、このメモリのチャンクを読み込む

  • with actual chars, as I do in that for loop there.

    私のような実際の文字、と そこに、forループという点で行います。

  • All right?

    すべての権利?

  • >> So now, the climax of these three examples

    >> だから今、のクライマックス これらの三つの例

  • that were seemingly broken last time, this Swap example, this function

    それは、一見、前回破壊した このスワップの例は、この関数

  • worked in the sense that it swapped a and b.

    感覚で働いていた それはaとbが入れ替わっていること。

  • But it didn't work in what other sense?

    しかし、それは他のどのような意味では機能しませんでした?

  • Yeah?

    うん?

  • >> AUDIENCE: [INAUDIBLE].

    >> 聴衆:[聞こえない]。

  • >> DAVID J. MALAN: Exactly.

    >> DAVID J.マラン:その通りです。

  • If I were to call this function from another-- for instance,

    私は、この関数を呼び出すとしたら 例えばanother--から、

  • from a function like main, where I have a variable, x and y, as I

    ここで、メインのような関数から 私は、私のように、変数、xとyを持っている

  • did last week, same code, and I pass in x and y

    先週やった、同じコード、 と私は、xとyを渡す

  • to Swap, and then call Swap-- this, of course, is the correct version

    交換し、次にSwap--これを呼び出すには、 もちろん、正しいバージョンである

  • is what we're about to see-- it did not work.

    私たちがしようとしているものです see--それはうまくいきませんでした。

  • So what is the fix?

    だから修正は何ですか?

  • >> Well, so just to be clear, let me go ahead

    >> まあ、これだけであることが 明確な、私は先に行ってみよう

  • and-- give me one second here, and see if I can show you the last one, which

    and--ここに私に1秒を与え、参照してください。 私はあなたに最後の1を表示することができれば、どの

  • will be in-- let's see if I can find this real fast-- OK, [INAUDIBLE].

    私が見つけることができるかどうかを見てみましょうin--になります この本物のfast-- OK、[聞こえない]。

  • OK, there it is.

    [OK]を、そこにそれがある。

  • So ignore the commands I'm just typing.

    だから私はちょうど入力しているコマンドを無視。

  • I want it to retrieve at the last minute an example

    私はそれがで取得したい 土壇場の例

  • from last time, which is now called no Swap.

    前回から、どの 今はスワップと呼ばれていません。

  • >> So no Swap is where we left off last time,

    >> だから何スワップ場所はありません 私たちは、前回中断した

  • whereby, I initialized x to 1 and y to 2.

    それによって、私は初期化さ 2対1であり、yからx。

  • I then call Swap, passing in 1 and 2.

    私は、1と2を渡して、スワップを呼び出します。

  • And then this function worked in some sense,

    そして、この機能 ある意味で働いていた、

  • but it had no permanent effect on x and y.

    それは永久にありませんでした xとyへの影響。

  • So the question at hand is, how now do we actually fix this problem?

    だから手元に質問がどのように今、ある 私たちは実際にこの問題を解決するのですか?

  • What is the solution at hand?

    手元の解決策は何ですか?

  • >> Well, in swap.c, which is new today, notice a couple of differences.

    >> さて、今日は新しく追加されましたswap.c、中、 相違点がいくつかに気づく。

  • x and y are the same.

    xおよびyは同じである。

  • But what is clearly different about line 25?

    しかし、何が明らかに 25行程度違うのですか?

  • What's new there, if you remember what it looked like a second ago?

    あなたが覚えていれば、そこに新機能 それは第二の前にように見えたもの?

  • >> AUDIENCE: [INAUDIBLE].

    >> 聴衆:[聞こえない]。

  • >> DAVID J. MALAN: Yeah.

    >> DAVID J.マラン:うん。

  • So the ampersands are a new piece of syntax not only in this program,

    だから、アンパサンドは、新しい作品である このプログラムだけでなく構文、

  • but also more generally in CS50.

    だけでなく、より一般的にはCS50中。

  • To date, I don't think we've seen any examples

    現在までに、私は考えていない 私たちはどんな例を見てきました

  • or really talked about them in any detail, other than, maybe, preemptively

    あるいは本当にいずれかでそれらについて話しました 多分、プリエンプティブ以外の細部、

  • in section, an ampersand like this.

    セクションで、このようなアンパサンド。

  • Well, it turns out ampersand is one of the last pieces of new syntax

    まあ、それはアンパサンドが1つであるが判明 新しい構文の最後の作品の

  • we're going to learn.

    私たちは学ぶつもりです。

  • All it means is the address of some variable.

    その意味すべてがある いくつかの変数のアドレス。

  • At what address does x live?

    どのアドレスでxが住んでいますか?

  • But what address does y live?

    しかし、yがどのアドレスを生きるのですか?

  • Because if the fundamental problem before

    ので、もし 前の基本的な問題

  • was that x and y were being passed as copies, what we really want to do

    xとyが渡されていたということでした 私たちが本当にやりたいことのコピーなど

  • is provide Swap with like a treasure map that leads to where x and y actually

    宝などでスワップを提供している 実際にここで、xとyにつながるマップ

  • are in RAM, so that Swap can follow that map

    ように、RAM内にある スワップそのマップに従うことができます

  • and go to wherever x or y marks the spot and change the actual values 1 and 2

    そしてxまたはyがスポットをマークどこに行く そして実際の値1と2を変更する

  • there.

    そこ。

  • >> So Swap needs to change slightly too.

    >> だから、スワップも若干変更する必要があります。

  • And at first glance, this might seem a little similar to char star.

    そして、一見、この全力 char型の星に少し似ているようだ。

  • And indeed it is.

    そして実際、それはある。

  • So a is a pointer to what type of data, based on this highlighted portion?

    だから、データの型へのポインタである、 このハイライトされた部分に基づいて?

  • So it's an int.

    だから、int型です。

  • >> So a is no longer an int, it's the address of an int.

    >> だから、もはやint型ではない、 それはint型のアドレスです。

  • And similarly, b is now going to be the address of an int.

    同様に、bが今起こっている int型のアドレスである。

  • So when I now call Swap from Main, I'm not going to give Swap 1 and 2.

    だから私は、今のメインのスワップを呼び出すときに、 私はスワップ1と2を与えるつもりはない。

  • I'm going to give it like Ox-something and Ox-something,

    私のようにそれを与えるつもりだ オックス代や牛、何か、

  • two addresses that will lead Swap to their actual locations

    つながる二つのアドレス 彼らの実際の場所へのスワップ

  • in my computer's memory.

    私のコンピュータのメモリに。

  • >> So now, my remaining implementation needs to change a tad.

    >> だから今、私の残りの実装 少しを変更する必要がある。

  • What's obviously different now in these three lines of code?

    何が今明らかに違う 次の3行のコードでの?

  • There's these damn stars all over the place, all right?

    これらすべてのいまいましいの星があります 場所の上、大丈夫?

  • So what's going on here?

    それでは、ここで起こっている?

  • Yeah?

    うん?

  • >> AUDIENCE: It's obviously [INAUDIBLE].

    >> 聴衆:それは[聞こえない]明らかだ。

  • >> DAVID J. MALAN: Exactly.

    >> DAVID J.マラン:その通りです。

  • So in this context-- and this was not the best design decision, admittedly,

    したがって、このcontext--で、これはありませんでした 最高のデザインの決定、確かに、

  • years ago.

    何年も前

  • In this context, where you just have a star,

    この文脈において、 あなただけの星を持っている、

  • and you don't have a data type, like int, immediately to the left,

    あなたがデータ型を持っていない、 int型のような、すぐに左に、

  • instead you have an equal sign, clearly, in this context, when you say star a,

    代わりに、あなたは明確に、等号を持っている、 この文脈では、あなたが言うときスター、

  • that means go to the address that's in a.

    それはに行くことを意味 内のアドレス。

  • Follow the treasure map, so to speak.

    いわば、宝の地図に従ってください。

  • >> And meanwhile, in line 37, it means the same thing.

    >> そして一方で、37行中、 それは同じことを意味します。

  • Go to the address a, and put what there?

    アドレスaに移動し、そこに何を入れる?

  • Whatever is at the location that b specifies.

    にあるものは何でも bが指定された場所。

  • In other words, go to b.

    つまり、Bに移動します。

  • Get that value.

    その値を取得します。

  • Go to a and, per the equal sign, the assignment operator,

    に移動し、同じあたり サインインして代入演算子、

  • put that value there.

    そこにその値を置く。

  • >> Similarly, int temp is just an int.

    >> 同様に、int型の一時だけのintです。

  • Nothing needs to change about temp.

    何も一時について変更する必要はありません。

  • It's just a spare glass from Annenberg for some milk or orange juice.

    それはアネンバーグからわずかスペアガラスです いくつかの牛乳やオレンジジュースのために。

  • But I do need to say, go to b.

    しかし、私は言ってBに行く必要があります。

  • Go to that destination and put the value in temp there.

    その宛先に移動し、 そこに一時に値を入れる。

  • So what's happening then?

    それでは、何が起こっているか?

  • When I actually call Swap this time, if this first tray here represents Main,

    私は実際にスワップ今回を呼び出すと、もし ここで、この第一のトレーメインを表し、

  • this second tray represents Swap, when I pass ampersand x and ampersand y

    この第二のトレイがスワップを表し、時 私はアンパサンドxとyのアンパサンドを渡す

  • from Main to Swap, just to be clear, what is this stack frame receiving?

    メインからわずか明確にすることが、交換すること、 このスタックフレームの受信は何ですか?

  • Yeah?

    うん?

  • >> AUDIENCE: [INAUDIBLE].

    >> 聴衆:[聞こえない]。

  • DAVID J. MALAN: Exactly.

    DAVID J.マラン:その通りです。

  • The address of x and the address of y.

    xとyのアドレスのアドレス。

  • And you can think of these like postal addresses.

    そして、あなたはこれらを考えることができます 郵便のアドレスのよう。

  • 33 Oxford Street and 35 Oxford Street, and you

    33オックスフォードストリートと35 オックスフォード·ストリート、そしてあなた

  • want to move the two buildings that are at those locations.

    二つの建物を移動したい これらの場所にあること。

  • >> It's sort of a ridiculous idea, but that's all we mean by address.

    >> それはばかげたアイデアのようなものだ、 それは私たちが、アドレスの意味すべてです。

  • Where in the world can you find those two ints?

    どこの世界ですることができます あなたはこれらの2つのintを見つける?

  • Where in the world can you find those two buildings?

    どこの世界であなたができる これら二つの建物を見つける?

  • So if finally, after all this time I go into today's source code and compile

    私はすべてのこの時間後に、最終的にはそうであれば 今日のソースコードにアクセスし、コンパイル

  • Swap and run ./swap, finally, for the first time do we actually see that

    スワップおよび実行./swap、最終的には、用 初めて私たちは実際にそれを見ていますか

  • my values have indeed been swapped successfully.

    私の値は、実際に持っている 成功裏にスワップさ。

  • And now, we can even take note of this in, say, gdb.

    そして今、私たちも取ることができます この中で、たとえば、GDBをメモ。

  • >> So let me go into the same file.

    >> だから私は、同じファイルに行きましょう。

  • Let me go ahead and run gdb of ./swap.

    私が先に行くと./swapのGDBを実行してみましょう。

  • And now, in Swap, I'm going to go ahead and set a break point in Main.

    そして今、スワップに、私は行くつもりです 先にメインにブレークポイントを設定します。

  • And now I'm going to go ahead and run the program.

    そして今、私は行くつもりです 先に、プログラムを実行します。

  • And now we see my code paused at that line.

    そして今、私たちは私のコードを参照してください その行で一時停止。

  • >> If I go ahead and print x, what should I see here?

    >> 私が先に行くと、印刷した場合 xが、私はここで何が表示されるはずです?

  • It's a question.

    それは問題だ。

  • Say again?

    もう一度言って?

  • >> AUDIENCE: [INAUDIBLE].

    >> 聴衆:[聞こえない]。

  • >> DAVID J. MALAN: So random numbers, maybe.

    >> DAVID J.マラン:だから 乱数、多分。

  • Maybe I get lucky, and it's nice and simple, like 0.

    たぶん私は幸運を得る、それはだ 0のような、素敵でシンプル。

  • But maybe it's some random number.

    しかし、おそらくそれはいくつかの乱数です。

  • In this case, I got lucky.

    この場合、私は幸運。

  • It just happens to be 0.

    それはちょうど0であることを起こる。

  • But it is indeed luck, because not until I

    しかし、それは確かに幸運であり、 ではない私まで、理由

  • type next and then print x has that line of code, line 19, been executed.

    次の入力し、印刷xがあることがあります コー​​ドの行、19行は、実行された。

  • >> Meanwhile, if I type next again, and now print out y, I'm going to see 2.

    >> 一方、私は再び次の入力した場合、および 今のyをプリントアウトし、私は2を見に行くよ。

  • Now, if I type next, it's going to get a little confusing, because now,

    私は、次の入力した場合さて、それはに起こっている 今ので、少し混乱するかもしれない、

  • the printf is going to appear on the screen, as it did. x is 1.

    printfのは上の表示されるように起こっている それがなかったような画面、。 xは1である。

  • >> Let's do this again.

    >> それでは、もう一度、これをやってみましょう。

  • And now, here's where things get interesting.

    そして今、ここにどこだ 物事は面白く。

  • Before I call Swap or even step into it, let's take a little peek.

    私は、スワップ、あるいはステップを呼び出す前に、 その中に、のはちょっと覗いてみましょう。

  • x is, again, 1.

    xは、再び、1である。

  • Y is, of course, quick sanity check, 2, so not hard there.

    Yは、もちろん、迅速な健全である そこにハード、チェック2、そうではない。

  • But what is ampersand x?

    しかし、アンパサンドxは何ですか?

  • Answer, it's kind of funky looking.

    回答、それは一種のファンキー探しています。

  • But the int star in parentheses is just gdp's way of saying this is an address.

    しかし、カッコ内のintスターだけです これを言ってのGDPの方法がアドレスです。

  • It's not an int, it's a pointer to an int, or otherwise known as an address.

    それは、それはへのポインタint型ですないです int型、またはその他のアドレスとも呼ばれます。

  • >> What is this crazy thing?

    >> このクレイジーなことは何ですか?

  • We've never seen something quite like that before.

    私たちは、何かを見たことがない かなり前にそのような。

  • So this is the address in my computer's memory of where x happens to live.

    だから、これは私のコンピュータの内のアドレスです xが生きるために起こる場所のメモリ。

  • It's Ox-something.

    それは、牛、何か。

  • And this is, frankly, why I've started drawing arrows,

    そして、これは率直に言って、なぜ、ある 私は、矢印を描き始めましたが、

  • instead of numbers, because who really cares

    数値の代わりに、 誰が本当に気に理由

  • that your int is at a particular address that's that big.

    あなたの整数、特にであることを 大きなことだアドレス。

  • But bffff0c4, these are all indeed hexadecimal digits,

    しかしbffff0c4、これらが全てです 確かに16進数、

  • which are 0 through f.

    fを0からである。

  • >> So we're not going to dwell too long on what those things are.

    >> だから私たちはあまりにも住むつもりはない それらのものが何であるかの長い。

  • But if I print out y, of course, I see 2.

    しかし、私は、Yをプリントアウトした場合、 もちろん、私は2を参照してください。

  • But ampersand y, I see this address.

    しかし、アンパサンドyは、私がこのアドレスを参照してください。

  • And notice, for the curious, how far apart are x and y?

    そして、好奇心のために、注意してください どれだけ離れて、xおよびyは?

  • You can ignore most of the address.

    あなたは、アドレスのほとんどを無視することができます。

  • Four bytes.

    4バイト。

  • And that's consistent with our earlier claim that how big is an int?

    そして、それは私たちと一致してい 以前のint型どの大きさであることを主張?

  • Four bytes.

    4バイト。

  • So it looks like everything's lining up nicely, as you might hope, in memory.

    だから、すべてのもののライニングアップのように見える きれいに、あなたは、メモリ内に、願っています可能性があるため。

  • >> So now, let's just fast forward to the end of this story.

    >> だから今、ちょうど早送りしてみましょう この物語の最後に。

  • Let's go ahead and type step, to dive into the Swap function.

    それでは先に行くとステップを入力してみましょう、 スワップ機能に飛び込むする。

  • Now notice, if I type a, it's identical to the address of x.

    今私は入力した場合、それはだ、気づく xのアドレスと同じ。

  • If I type b, it's identical to the address of y.

    私はBを入力すると、それは同じだ yのアドレスへ。

  • So what should I see if I say, go to the address a?

    私のであれば、私は何が表示されるはずです 、アドレスに行くと言う?

  • So print star a.

    だから、スタープリントする。

  • So star means go there, in this context.

    だから星はこのコンテキストでは、そこに行くことを意味します。

  • Ampersand means what's the address of.

    アンパサンドのアドレスに何を意味します。

  • So star a means 1.

    だから手段1スター。

  • And print star b gives me 2.

    そして、プリントスターのbは私に2を提供します。

  • >> And let me assume, for the moment, that at least the code that

    >> そして、私は一瞬、と仮定しましょう​​、 少なくともコードということ

  • proceeds to execute now can be reasoned through in that way.

    することができ、今、実行に移行する そのように通って推論した。

  • But we'll revisit this idea before long.

    しかし、私たちはずっと前にこのアイデアを再検討します。

  • So this version of Swap is now correct and allows

    スワップのため、このバージョン 今正しく、ことができます

  • us to swap this particular data type.

    私たちは、この特定のデータ型を交換する。

  • >> So any questions then on Swap?

    >> だから、ご質問、次にスワップについて?

  • On star?

    スターオン?

  • On address of?

    のアドレスに?

  • And you'll see, with problem set 4, sort of,

    そして、あなたはして、表示​​されます 問題は、一種の、4セット

  • but problem set 5, definitely, how these things are useful and get much more

    が、問題は、どのようにこれらの間違いなく、5を設定 物事は有用であり、多くを得る

  • comfortable with them, as a result.

    結果として、彼らと快適。

  • Anything at all?

    まったく何?

  • All right.

    かしこまりました。

  • So malloc is, again, this function that just allocates memory, memory

    だからmalloc関数は、再び、この機能で それはちょうど、メモリ、メモリを割り当て

  • allocation.

    配分。

  • And why is this useful?

    そして、なぜこれが便利なのですか?

  • Well, all this time, you've been using malloc.

    さて、すべてのこの時間、 あなたはmalloc関数を使用してきた。

  • If you consider now how getString works, presumably, it's

    あなたは今どのように考えると 作品をgetStringで、おそらく、それはだ

  • been asking someone for a chunk of memory, anytime the user types a string

    のチャンクの誰かを求めて メモリ、いつでもユーザーの種類の文字列

  • in, because we certainly didn't know, as CS50 staff,

    中、確かに私たちのため CS50のスタッフとして、知りませんでした、

  • how big those strings that humans are going to type might be.

    どのように大きなその人間これらの文字列 かもしれないと入力しようとしている。

  • >> So let's, for the first time, start to peel back how the CS50 library works,

    >> それでは、最初に、に始めましょう ピールバック方法CS50ライブラリ作品、

  • by way of a couple of examples that will lead us there.

    例をいくつ経由で それはそこに私たちをリードします。

  • So if I open up gedit and open up scanf 0,

    だから私はgeditのを開く場合は、 そして、scanfの0を開く

  • we're going to see the following code.

    私たちは、次のコードを参照してくださいとしている。

  • Scanf 0, available on the website for today, has relatively few lines of code

    のためのウェブサイト上で利用可能なscanf関数0、 今日、比較的少ない行数のコードを持って

  • here, 14 through 20.

    ここでは、20を経て14。

  • And let's see what it's doing.

    そして、のは、それがやっているか見てみましょう。

  • It declares an int, called x.

    それは、int型と呼ばれるのxを宣言しています。

  • It says something like, number please.

    それは数下さい、のようなものを言います。

  • And now it says, scanf %i, &x.

    そして今、それはscanf関数の%I、&X、と言います。

  • So there's a bunch of new stuff there.

    だから、そこに新しいものの束があります。

  • >> But scanf, you can kind of think of as the opposite of printf.

    >> しかし、scanf関数は、一種の考えることができます のprintfの反対としての。

  • printf, of course, prints to the screen.

    printfのはもちろん、画面に出力します。

  • scanf sort of scans from the user's keyboard something he or she has typed.

    ユーザーのからのスキャンのscanf関数の並べ替え 彼または彼女がタイプしたキーボードの何か。

  • >> %i is just like printf.

    >> %iはちょうどprintfのようなものです。

  • This means expect the user to type an int.

    これは期待する意味 ユーザーは、int型を入力します。

  • And now, why do you think I might be passing scanf &x?

    そして今、なぜあなたは私が思いますか scanfの&Xを渡すかもしれない?

  • If the purpose in life of scanf is to get something from the user,

    scanf関数の生活の中で目的の場合 ユーザーから何かを得ることです、

  • what is the meaning of passing it, &x, now?

    の意味は何ですか 今、それを渡し、&X?

  • Yeah?

    うん?

  • >> AUDIENCE: [INAUDIBLE].

    >> 聴衆:[聞こえない]。

  • DAVID J. MALAN: Exactly.

    DAVID J.マラン:その通りです。

  • Whatever I, the human, type in, my input is going to be saved at that location.

    どのような私は、人間は、私の入力を入力 その場所に保存されようとしている。

  • It's not sufficient, recall, to just pass in x, because we've seen already,

    それはちょうどに、十分な、リコールではありません 私たちはすでに見てきたので、Xを渡し、

  • any time you pass just a raw variable, like an int, to some other function,

    いつでもあなたは、単なる生変数を渡す int型のような、いくつかの他の機能に、

  • sure, it can change that variable, but not permanently.

    確かに、それはそれを変更することができます 変数ではなく、永久に。

  • It can't have an effect on Main.

    それは、メインに影響を与えることはできません。

  • It can only change its own local copy.

    それだけで、独自のローカルコピーを変更することができます。

  • But if, instead, you don't give me the actual int,

    しかし、もし、その代わりに、あなたはしないでください 私に実際のint型を与え、

  • but you give me directions to that int, I now, being scanf,

    しかし、あなたは私に指示を与える そのint型、今、scanf関数であること、

  • surely, I can follow that address and put a number there

    確かに、私はそれに従うことができます 対処し、そこに番号を入れる

  • so you have access to it as well.

    そうあなたにもそれにアクセスすることができます。

  • >> So when I run this program, let's see.

    >> 私はこのプログラムを実行するときに、見てみましょう。

  • Make scanf 0 dot slash, scanf 0.

    scanfの0ドットスラッシュ、scanf関数0にしてください。

  • And if I now type a number like 50, thanks for the 50.

    そして、私は今番号を入力した場合 50のおかげで、50等である。

  • If I now type a number like negative 1, for the negative 1.

    私は今のように数値を入力した場合 負の1のために、1負。

  • I now type a number like 1.5, hm.

    私は今、HM、1.5のように数値を入力します。

  • Why did my program ignore me?

    なぜ私のプログラムは私を無視したのですか?

  • Well, because simply, I told it to expect an int only.

    さて、という理由だけで、私は言った それだけのintを期待する。

  • All right.

    かしこまりました。

  • So that's one version of this.

    だから、これのバージョンは1つです。

  • Let's take things up a notch and propose that this is not good.

    のノッチ物事を見てみましょうと これは良くないことを提案する。

  • And herein lies a very simple example of how we can start writing code

    そして、ここに非常に簡単な例がある 私たちは、コードを書き始める方法の

  • that other people can exploit or compromise by doing bad things.

    他の人が利用することができますか 悪いことを行うことで妥協。

  • So line 16, so similar in spirit to before,

    だからライン16、非常に似て 前に精神で、

  • but I'm not declaring it int this time.

    私はそれが今回はint型の宣言ではないよ。

  • I'm declaring it char star, aka string.

    私はそれを文字列別名char型星を、宣言しています。

  • >> But what does that really mean?

    >> しかし、それは本当に何を意味するのでしょうか?

  • So if I don't specify an address-- and I'm calling it arbitrarily, buffer,

    だから私はaddress--を指定しない場合と 私は、任意のバッファを、それを呼んでいる、

  • but I could call it s, to be simple-- and then I do this, explain to me,

    しかし、私はあること、だ、それを呼び出すことができsimple-- そして、私は、これを行う私に説明、

  • if you could, based on the previous logic, what is scanf doing in line 18,

    あなたは以前に基づいて、できれば ロジック、scanfの18行目に何をしているか、

  • if pass %s and buffer, which is an address?

    パス%sは、バッファであれば、 アドレスはありますか?

  • What is scanf, if you apply the exact same logic as version 0,

    あなたが適用される場合、scanf関数とは何ですか バージョン0と全く同じロジック、

  • going to try to do here, when the user types something in?

    と、ここで行うようにしようとするつもり ユーザーの種類の中で何か?

  • Yeah?

    うん?

  • >> AUDIENCE: [INAUDIBLE].

    >> 聴衆:[聞こえない]。

  • >> DAVID J. MALAN: Exactly.

    >> DAVID J.マラン:その通りです。

  • Scanf, by the logic earlier, is going to take the string

    scanf関数、ロジック以前のことで、 文字列を取るつもりされている

  • that the human typed in-- it's now a string,

    人間が入力したことを 、それが今の文字列ですin--

  • it's not a number, presumably, if he or she cooperates--

    それは、おそらく、数ではありません 彼または彼女はcooperates--た場合

  • and it's going to try to put that string in memory at whatever address

    そしてそれはそれを置くことを試みるために起こっている どのようなアドレスのメモリ内の文字列

  • buffer specifies.

    バッファが指定されます。

  • And this is great, because buffer is indeed meant to be an address.

    そして、これは、素晴らしいですバッファ理由 実際のアドレスであることを意味する。

  • >> But I claim this program is buggy in a very serious way, because what value is

    >> しかし、私はこのプログラムはにバグが主張 非常に深刻な方法、どのような値であるため、

  • buffer by default?

    デフォルトでは、バッファ?

  • What have I initialized into?

    私は何をしに初期化した?

  • What chunk of memory?

    メモリのどのチャンク?

  • I haven't, right?

    私が持っていないでしょ?

  • >> So even though I've allocated a char star that's no longer called s,

    >> だから私は、割り当てられたにも関わらず、 もはやSと呼ばれていたcharスター、

  • it's instead called, buffer-- so let's draw the variable's name

    それは代わりに呼ばれていますので、buffer-- それでは、変数の名前を描いてみましょう

  • now as buffer-- if I haven't called getString or malloc here,

    私が持っていない場合は、今のようにbuffer-- ここでは、getStringまたはmalloc関数と呼ばれ、

  • that effectively means that buffer is just some garbage value.

    その効果的にことを意味します バッファは、単にいくつかのごみ値です。

  • >> Now what does that mean?

    >> 今では何を意味するのでしょうか?

  • It means that I have told scanf to expect a string from the user.

    それは私がscanf関数に言ったことを意味します ユーザーから文字列を期待する。

  • And you know what?

    そして、あなたは何を知っていますか?

  • Whatever this thing is pointing to-- and I draw question mark,

    何でもこの事を指している to--と私は疑問符を描き、

  • but in reality, it's going to be something like Ox1, 2, 3, right?

    実際には、それはなるだろう OX1、2、3、のようなものでしょ?

  • It's some bogus value that just happens to be there from before.

    これは、いくつかの偽の値だということだけで 以前からそこにあることを起こる。

  • So put another way, it's as though buffer is just

    だから、別の言い方を、それはだ バッファはちょうどであるかのように

  • pointing to something in memory.

    メモリ内の何かを指している。

  • I have no idea what.

    私は何か分からない。

  • >> So if I type in gabe now, it's going to try to put g-a-b-e /0 there.

    >> 私は今、ゲイブに入力した場合だから、それは起こっている そこのg-B-E / 0を入れて試してみる。

  • But who knows what that is?

    しかし、誰がそれが何であるかを知っている?

  • And in the past, any time we've tried to touch

    そして、過去に、いずれかの 私たちが触れないようにしようとした時

  • memory that doesn't belong to us, what has happened?

    属していないメモリ 私たちに、何が起こったの?

  • Or almost every time.

    またはほぼ毎回。

  • Segmentation fault, right?

    セグメンテーションフォルト、右か?

  • >> This arrow, I have no idea where it's pointing. it's just some random value.

    >> この矢印は、私はそれがだか分からない ポインティング。それだけでいくつかのランダムな値です。

  • And of course, if you interpret a random value as an address,

    そしてもちろん、あなたが解釈した場合 アドレスとしてランダム値、

  • you're going to go to some random destination.

    あなたがに行くつもりです いくつかのランダムな目的地。

  • So gabe might indeed crash my program in this case here.

    だから、ゲイブクラッシュ確かかもしれない ここで、この場合の私のプログラム。

  • >> So what can we do that's almost as bad?

    >> だから私たちはそれがほぼ同じ悪い何ができますか?

  • Consider this third and final example of scanf.

    この第三を検討し、 scanf関数の最後の例。

  • This version is better in what sense?

    このバージョンでは、どのような意味で良いですか?

  • If you are comfortable with the previous problem, this is better.

    あなたが慣れている場合は 前の問題は、これが優れている。

  • Why?

    なぜ?

  • >> AUDIENCE: [INAUDIBLE].

    >> 聴衆:[聞こえない]。

  • DAVID J. MALAN: Good.

    DAVID J.マラン:良い。

  • So this case of line 16 is better, in the sense

    ライン16のしたがって、この場合 ある意味で、優れている

  • that we're explicitly allocating some memory.

    私たちは、明示的にしていることを いくつかのメモリを割り当てる。

  • We're not using malloc, we're using the week 2

    私たちは、malloc関数を使用していない 私たちは週に2使用している

  • approach of just declaring an array.

    ただ配列を宣言するアプローチ。

  • And we've said before that a string is just an array of characters,

    そして、私たちは、その文字列の前に言った 文字だけの配列です、

  • so this is totally legitimate.

    これは完全に正当なものである。

  • But it's, of course, as you note, fixed size, 16.

    しかし、それはのように、当然のことながら、だ あなたは、固定サイズ、16の点に注意してください。

  • >> So this program is totally safe, if I type

    >> したがって、このプログラムです 私が入力した場合、完全に安全

  • in one character strings, two character strings, 15 character strings.

    1文字の文字列では、2つの文字 文字列、15文字の文字列。

  • But as soon as I start typing 16, 17, 18, 1,000 character strings,

    しかし、すぐに、私は16をタイプし始めると、 17、18 1,000文字列、

  • where is that string going to end up?

    どこにその文字列が終わるつもりですか?

  • It's going to end up partly here.

    これは、一部はここに終わるだろう。

  • But then who knows what else is beyond the boundaries

    しかし、その後、誰が他に何を知っている 境界を超えている

  • of this particular array?

    この特定の配列の?

  • >> It's as though I've declared 16 boxes here.

    >> 私がしたかのようなものだ ここに16のボックスを宣言した。

  • So rather than draw out all 16, we'll just pretend that I've drawn 16.

    したがって、すべての16を引き出すのではなく、私たちはよ ちょうど私が16を描いたことふりをする。

  • But if I then try to read a string that's much longer, like 50 characters,

    しかし、私は、文字列を読み取るしようとした場合 これは50文字のように、はるかに長いですが、

  • I'm going to start putting a, b, c, d, x, y, z.

    私は置く作業を開始するつもりだ A、B、C、D、x、y、zの。

  • And this is presumably some other memory segment

    そして、これはおそらくです 他のいくつかのメモリ·セグメント

  • that, again, might cause my program to crash,

    それは、再び、発生する可能性があり クラッシュする私のプログラム、

  • because I've not asked for anything more than just 16 bytes.

    私はを求めていませんでしたので、 ちょうど16バイト以上のもの。

  • >> So who cares?

    >> だから、誰が気に?

  • Well, here's the CS50 library.

    さて、ここでCS50ライブラリです。

  • And most of this is just like instructions up top.

    そして、これのほとんどはちょうどです トップアップの指示などである。

  • The CS50 library, all this time, has had this line in line 52.

    CS50ライブラリ、すべてのこの時間、 52行で、この行を持っています。

  • We've seen typedef, or you will see typedef

    私たちは、typedefを見たり、き あなたはtypedefで表示されます

  • in pset 4, which just creates a synonym whereby char star can be more

    ちょうど作成のpset 4、内 char型の星はもっとすることができる同義語

  • simply referred to as string.

    単に文字列と呼ばれる。

  • So this is one of the few training wheels

    だから、これはの一つである いくつかの補助輪

  • we've used secretly underneath the hood.

    私たちは、フードの下に密かに使用しました。

  • >> Meanwhile, here's the function, getchar.

    >> 一方、ここにgetchar関数です。

  • Now apparently, there's no body to it.

    さて、明らかに、それへのボディはありません。

  • And in fact, if I keep scrolling, I don't actually

    そして、実際に、私が続ければ スクロール、私は実際にない

  • see any implementations of these functions.

    いずれの実装を参照してください。 これらの関数の。

  • As a sanity check, why is that?

    健全性チェックとして、それはなぜでしょうか?

  • >> AUDIENCE: [INAUDIBLE].

    >> 聴衆:[聞こえない]。

  • DAVID J. MALAN: Yeah.

    DAVID J.マラン:うん。

  • So this is the header file.

    だから、これはヘッダファイルです。

  • And header files contain prototypes, plus some other stuff, it seems,

    そして、ヘッダファイルには、プロトタイプが含まれている、 プラスいくつかの他のもの、それが思われる、

  • like typedefs.

    のtypedefのような。

  • But in CS50.c, which we've never given you outright,

    しかし、私たちがしたCS50.c、中 あからさまなあなたに与えられたことはありません、

  • but has been in the CS50 appliance all this time, deep inside of its folders,

    しかし、すべてのCS50アプライアンスにされている 今回は、そのフォルダの奥深く、

  • notice that there's a whole bunch of functions in here.

    全体があることに気付く ここでの関数の束。

  • >> In fact, let's scroll down.

    >> 実際には、のは下にスクロールしてみましょう。

  • Let's ignore most of them, for now.

    それでは、今のところ、それらのほとんどを無視しましょう​​。

  • But scroll down to getInt and see how getInt works.

    しかしgetIntはまでスクロールし そしてgetIntは動作を確認。

  • So here is getInt.

    だからここgetIntはです。

  • And if you ever really cared how get int works, here is its documentation.

    あなたが本当に気にした場合、どのように取得する int型は、ここで、機能し、そのマニュアルである。

  • And among the things it says is it tells you

    そしてとりわけ、 それはそれはあなたを伝えていると言う

  • what the ranges of values it can return.

    何それが返すことができる値の範囲。

  • It's essentially negative 2 billion to positive 2 billion, give or take.

    それは本質的に負の20億 正の20億に、与えるか、または取る。

  • >> And it turns out, all this time, even though we've never

    >> そしてそれは、このすべてが判明 時間は、私たちは初めてだなくても

  • had you check for it, if something goes wrong,

    あなたがそれをチェックしていた、 何かがうまくいかない場合には、

  • it turns out that all this time, getInt has

    それはすべてのことが判明した 今回は、getIntはがあります

  • been returning a special constant, not null,

    特別なを返すされてい 、ヌル、一定ではない

  • but rather int_max, which is just a programmer's convention.

    むしろある、INT_MAX ただプログラマの大会。

  • It means here is a special value.

    なお、ここで意味特別な値です。

  • Make sure to check for this, just in case something goes wrong.

    ただ、これをチェックしてください 場合には、何かがうまくいかない。

  • But we've never bothered with that to date,

    しかし、私たちは気にしたことがない これまでのものと、

  • because again, this is meant to simplify.

    再び、このため 簡略化することを意味する。

  • >> But how does getInt get implemented?

    >> しかし、どのようにgetIntはが実装されるのですか?

  • Well, one, it takes no arguments.

    さて、人は、それは引数を取りません。

  • We know that.

    私たちはそれを知っている。

  • It returns an int.

    これは、intを返します。

  • We know that.

    私たちはそれを知っている。

  • So how does it work underneath the hood?

    それでは、どのようそれはボンネットの下に動作しますか?

  • >> So there's apparently an infinite loop, at least the appearance of one.

    >> だから、明らかに無限あります ループ、一方の​​少なくとも外観。

  • Notice that we're using getString.

    私たちはにgetStringを使用していることに注意してください。

  • So that's interesting. getInt calls our own function, getString.

    だから面白い。 getIntは 私たち自身の機能、のgetStringを呼び出します。

  • And now why might this be the case?

    そして今、なぜこのような場合でしょうか?

  • Why am I being defensive here in line 165?

    なぜ私は守備されるのです ここで、ライン165内の?

  • What could happen in line 164, just to be clear?

    どのようなラインで発生する可能性があります 164、ちょうど明確にするには?

  • It's the same answer as before.

    これは、前と同じ答えだ。

  • Might just be out of memory.

    ただメモリが不足かもしれません。

  • Something goes wrong with getString, we've got to be able to handle that.

    何かがのgetStringで問題が発生した、 私たちはそれを扱うことができるようになってきました。

  • And the reason I don't return null is that, technically, null is a pointer.

    そして、私がnullを返さない理由は、 それは、技術的には、ヌルポインタである。

  • getInt has to return an int.

    getIntはint型を返すことがあります。

  • So I've arbitrarily decided, essentially,

    だから私は任意にしました 基本的に、決定した、

  • that 2 billion, give or take, is going to be a special value that I can never

    、20億、与えるか、または取ることが起こっている 私は決してできる特殊な値になるように

  • actually get from the user.

    実際にユーザから得る。

  • It's just the one value I'm going to waste to represent an error code.

    それは私が行くよただ一つの値だ エラーコードを表現するために無駄にする。

  • >> So now, things get a little fancy.

    >> だから今、物事は少し空想を取得します。

  • And it's not quite the same function as before, but it's very similar.

    そして、それは全く同じ機能ではありません 以前のように、それは非常に似ています。

  • So notice, I declare here, in line 172, both an int n and a char c.

    だから私はラインで、ここに宣言し、注意してください 172、int型のn及びチャーCの両方。

  • And then I use this funky line, sscanf, which it turns out

    そして私は、このファンキーな行を使用し、 結局のところsscanfは、

  • doesn't scan a string from the keyboard.

    キーボードから文字列をスキャンしません。

  • It stands an existing string that the user has already typed in.

    これは、既存の文字列を立って、その ユーザーは、すでに入力した。

  • So I already called getString, which means I have a string in memory.

    だから私はすでに、これにgetStringと呼ばれる 私はメモリ内の文字列があることを意味します。

  • sscanf is what you'd call a parsing function.

    sscanfはは何をしたいです 解析関数を呼び出します。

  • It looks at the string I've typed in, character by character,

    それは私がした文字列を見て 、文字ごとに入力した

  • and does something useful.

    有用な何かをする。

  • That string is stored in line.

    その文字列は行に格納されます。

  • And I know that only by going back up here and saying, oh, OK,

    そして、私は唯一で行くことを知っている [OK]を、ああ、ここと言ってバックアップし、

  • I called it not s this time, but line.

    私は、s今回はそれをしないと呼ばれるが、ライン。

  • >> And now this is a little different.

    >> そして今、これは少し異なります。

  • But this effectively means, for reasons we'll somewhat wave our hands at today,

    しかし、これは効果的理由のために、手段 私たちは、多少、今日の私たちの手を振るよ

  • that we are checking to see if the user typed in

    私達はにチェックしていることを ユーザーが入力したかどうかを確認

  • and int and maybe another character.

    とint型と、おそらく別の文字。

  • If the user typed in an int, it's going to be stored in n, because I'm

    ユーザーがintで入力した場合、それはだ 私はだから、n個に格納される予定

  • passing this by address, the new trick we've seen today.

    アドレスで、これを渡し、 私たちが今日見てきた新しいトリック。

  • If the user also typed in like 123x, that x

    また、ユーザは、入力した場合 123X等では、そのX

  • is going to end up a letter in character c.

    結局しようとしている 文字cの文字。

  • >> Now it turns out that sscanf will tell me, intelligently,

    >> 今ではそのsscanfは判明 インテリジェントに、私に教えてくれます、

  • how many variables was sscanf successfully able to fill.

    sscanfはどのように多くの変数があった 埋めることに成功できる。

  • So by this logic, if the function I'm implementing is getInt,

    このロジックによる、もしそうであれば、関数 私が実装している場合、getIntあり、

  • but I'm checking, potentially, for the user

    私がチェックしています、 潜在的に、利用者のための

  • to have typed in an int followed by something else,

    int型に型指定されていると 何か他のものに続いて、

  • what do I want sscanf's return value truly to be?

    私は、sscanfは年代何をしたいですか 戻り値は真になりますか?

  • If the purpose is to get just an int from the user?

    目的は、取得している場合 ユーザーからわずかint型?

  • >> So if sscanf returns 2, what does that mean?

    >> もしそうであればsscanfは戻ります 2、それは何を意味するのでしょうか?

  • The user typed in something like, literally,

    ユーザーが入力した内 何かのように、文字通り、

  • 123x, which is just nonsense.

    意味がない123X、。

  • It's an error condition, and I want to check for that.

    これは、エラー状態だし、 私はそれをチェックしたいと思います。

  • >> So if the user types this in, by this logic, what does sscanf return,

    >> だから、これでユーザータイプの場合、バイ このロジック、返すSSCANF何、

  • would you say?

    あなたは言うでしょうか?

  • So it's going to return 2, because the 123 is going to go in here,

    だから、あるため、2を返すために起こっている 123はここに行くために起こっている、

  • and the x is going to end up in here.

    xは、ここで終了する予定です。

  • But I don't want the x to get filled.

    しかし、私は、xがいっぱいにする必要はありません。

  • I want to sscanf to only succeed in filling the first of its variables.

    私だけで成功するためにはsscanfしたい その変数の最初の充填。

  • And so that's why I want sscanf to return 1.

    だからそれが理由です、私 sscanfは1を返したい。

  • >> And if this is a bit over the head for the moment, that's totally fine.

    >> そして、これは少し頭を超えている場合 一瞬、それは全く問題ありません。

  • Realize though, that one of the values of getInt and getString

    しかしのその1を実現 getIntはとのgetStringの値

  • is that we're doing a heck of a lot of error checking like this so

    私たちはの一体をやっているということです したがって、このようなエラーチェックがたくさん

  • that, to date, you can pretty much type anything at your keyboard,

    その、これまでに、あなたはかなりすることができます あなたのキーボードから何も入力し、

  • and we will catch it.

    そして私たちはそれをキャッチします。

  • And we certainly, the staff, will definitely not

    そして、私たちは確か、 スタッフは、間違いなくしません

  • be the source of a bug in your program, because we're defensively

    あなたのバグの原因になる 私たちは守備だからプログラム、

  • checking for all of the stupid things that a user might do,

    愚かなのすべてをチェックする ユーザーが行う可能性があります事、

  • like typing a string, when you really wanted int.

    文字列を入力と同様に、時 あなたは本当にint型を望んでいた。

  • So for now-- we'll come back to this before long--

    だから私たちは来るnow--用 戻ってこれまでlong--前

  • but all this time, getString and getInt have

    しかしすべてのこの時間、 のgetStringやgetIntはを持っている

  • been underneath the hood using this basic idea of addresses of memory.

    これを使用して、ボンネットの下にあった メモリのアドレスの基本的な考え方。

  • >> So now, let's make things a little more user-friendly.

    >> だから今、Aの物事を作ってみよう もう少しユーザーフレンドリー。

  • As you may recall, from Binky last time-- if my mouse will cooperate-- so

    あなたはBinky最後から、思い出してたよう time--私のマウスはそうcooperate--する場合

  • we had this code, which frankly, is fairly nonsensical.

    私たちは、このコードを持っていた 率直に言って、かなり無意味である。

  • This code achieves nothing useful, but it was the example

    このコードは何も達成していない 有用な、しかしそれは一例であっ

  • that professor Parlante used in order to represent

    その教授Parlante 表すために使用さ

  • what was going on in a program involving memory.

    何がで起こっていた メモリに関連するプログラム。

  • >> So let's retell this story super briefly.

    >> それでは、これを再び語るましょう 物語超簡単に。

  • These first two lines, in English, do what, would you say?

    これらの最初の二行で 英語では、あなたは何を言うでしょうか?

  • Just in reasonably human, but slightly technical terms, take a stab.

    ただ合理的人間が、 少し技術的な用語は、刺しを取る。

  • AUDIENCE: [INAUDIBLE].

    聴衆:[聞こえない]。

  • >> DAVID J. MALAN: OK, you're establishing addresses for your x and y variables.

    >> DAVID J.マラン:OK、あなたが確立している あなたのxとyの変数のアドレス。

  • Not quite, because x and y are not variables in the traditional sense.

    かなり、xおよびyはないためではない 伝統的な意味での変数。

  • x and y are addresses or will store address.

    xおよびyはアドレスである またはアドレスを格納します。

  • So let's try this once more.

    それでは、もう一度、これを試してみましょう。

  • Not a bad start, though.

    悪くないスタート、しかし。

  • Yeah?

    うん?

  • >> AUDIENCE: [INAUDIBLE].

    >> 聴衆:[聞こえない]。

  • DAVID J. MALAN: Good.

    DAVID J.マラン:良い。

  • I think that's a little cleaner.

    私は少しクリーナーだと思う。

  • Declaring two pointers, two integers.

    二つのポインタ、2つの整数を宣言。

  • And we're calling them x and y.

    そして、私たちは彼らに、xとyを呼んでいる。

  • Or if we were to draw this as a picture, again,

    それともならば描画する この絵のような、再び、

  • recall quite simply that all we're doing with that first line

    非常に単純にそのすべてを思い出す 私たちは、その最初の行でやっている

  • is drawing a box like this, with some garbage value in it,

    このような箱を集めている、 その中にいくつかのごみ値で、

  • and calling it x, and then another box like this,

    してからxを呼び出して、 このような別のボックス、

  • with some garbage value in it, calling it y.

    いくつかのごみ値で その中に、yのそれを呼び出す。

  • We've declared two pointers that ultimately

    私たちは、2宣言した ポインタその究極的

  • will store the address of an int.

    int型のアドレスを格納します。

  • So that's all there.

    だから、すべてあります。

  • >> So when Binky did this, the clay just looked like this.

    >> Binkyはこれをしなかったので、とき、 粘土はちょうどこのように見えた。

  • And Nick just kind of wrapped up the arrows,

    そして、ニックだけの種類 矢印を終え、

  • as though they're not pointing anywhere in particular, because they're just

    彼らはどこにも向いていないかのように 特に、彼らはただだから

  • garbage values.

    ごみ値。

  • They're not explicitly initialized anywhere in particular.

    彼らは明示的に初期化していない 特にどこでも。

  • >> Now the next line of code, recall, was this.

    >> の今すぐ次の行 コー​​ド、リコールは、このでした。

  • So in reasonably user-friendly, but somewhat technical English,

    、合理的にユーザーフレンドリーで非常に やや技術的な英語、

  • what is this line of code doing?

    コー​​ドすることのこのラインは何ですか?

  • Yeah?

    うん?

  • >> AUDIENCE: [INAUDIBLE].

    >> 聴衆:[聞こえない]。

  • >> DAVID J. MALAN: Perfect.

    >> DAVID J.マラン:パーフェクト。

  • It's allocating the chunk of the memory that's the size of an int.

    それは、のチャンクを割り当てるだ int型のサイズであるメモリ。

  • And that's half the answer.

    そして、それは半分の答​​えだ。

  • You answered the right half of the expression.

    あなたは正しい答え 式の半分。

  • What is happening on the left-hand side of the equal sign?

    何で何が起こっている 等号の左側?

  • Yeah?

    うん?

  • AUDIENCE: And assigns it to the variable x?

    聴衆:および譲受人 、それを変数xに?

  • >> DAVID J. MALAN: And assigns it to the variable x.

    >> DAVID J.マラン:そして割り当て それを変数xに。

  • So to recap, right-hand side allocates enough memory to store an int.

    要約、右側の割り当てにそう int型を格納するのに十分なメモリ。

  • But malloc specifically returns the address

    しかし、malloc関数、具体的 アドレスを返す

  • of that chunk of memory, which you've just proposed gets stored in x.

    あなたがしたメモリのチャンクの ただ、提案のxに格納されます。

  • >> So what Nick did last time with Binky is he dragged that pointer out, the clay,

    >> それでは、ニックはBinkyで前回やったことはある 彼はそのポインタをドラッグし、粘土、

  • to point now at a white chunk of memory that is equal to the size of an int.

    メモリの白いチャンクで今指すように それは、int型のサイズと同じである。

  • And indeed, that's meant to represent four bytes.

    そして実際、それは意味だ 4バイトを表します。

  • >> Now, the next line of code did this, star x gets 42.

    >> コー​​ドのさて、次の行 これをした、スターのxが42を取得します。

  • So 42 is straightforward on the right-hand side, meaning of life.

    だから42が上に簡単です 右側、人生の意味。

  • Left-hand side, star x means what?

    左側、スターのxが何を意味する?

  • That too might have gone-- that's OK.

    それは大丈夫ですgone--それも可能性があります。

  • OK.

    [OK]をクリックします。

  • >> AUDIENCE: Basically, go to the [INAUDIBLE]

    >> 聴衆:基本的には、 [聞き取れない]に移動します

  • DAVID J. MALAN: Good.

    DAVID J.マラン:良い。

  • AUDIENCE: [INAUDIBLE].

    聴衆:[聞こえない]。

  • DAVID J. MALAN: Exactly.

    DAVID J.マラン:その通りです。

  • Left-hand side means go to x.

    左辺は、xに行くことを意味します。

  • x is address.

    xはアドレスです。

  • It's like 33 Oxford Street, or Ox1.

    それは、33オックスフォードストリート、またはOX1のようなものだ。

  • And star x means go to that address and put what there?

    そして、スターのxはそれに行くことを意味 アドレスとそこに何を入れる?

  • 42.

    42。

  • >> So indeed, that's exactly what Nick did.

    >> だから確かに、それはニックはまったく同じものです。

  • He started with by, essentially, mentally

    彼は、ことで始まり 基本的に、精神的に

  • pointing a finger at x, following the arrow

    指でのポインティング 矢印以下のx、

  • to the white box on the right-hand side, and putting the number 42 there.

    右側の白いボックスに 側、そしてそこに数42を置く。

  • But then things got a little dangerous, right?

    しかし、その後のことが得た 少し危険な、右か?

  • Binky's about to lose his head.

    Binkyの頭を失うことについての。

  • >> Star y equals 13, bad luck, means what?

    >> スターyは何を意味し、13、不運に等しい?

  • So star y means go to the address in y.

    だから、スターのyの手段がyのアドレスにアクセスしてください。

  • But what is the address in y?

    しかし、yのアドレスは何ですか?

  • All right, it's garbage value, right?

    すべての権利、それが正しい、ガベージ値ですか?

  • I drew it as a question mark.

    私は疑問符としてそれを描きました。

  • Nick drew it as a curled up arrow.

    ニックは丸くなっ矢印として描きました。

  • And as soon as you try to do star y, saying go there,

    そして、できるだけ早くあなたがしようとして そこに行くと言って、スターyを行い、

  • but there is not a legitimate address, it's some bogus location,

    しかし、正当ではありません アドレスは、いくつかの偽の立地、

  • the program's going to crash.

    プログラムがクラッシュするだろう。

  • And Binky's head is going to fly off here, as it did.

    そして、Binkyの頭が起こっている それがなかったように、ここに飛んでいる。

  • >> So in the end, this program was just flat out flaw.

    >> このプログラムは、最終的にはそう ちょうど平らな傷だった。

  • It was a buggy program.

    これは、バグのあるプログラムでした。

  • And it needed to be fixed.

    そして、それは修正される必要がありました。

  • And the only way, really, to fix it would be, for instance, this line,

    そして、唯一の方法は、実際に、それを修正するために 例えば、このラインになり、

  • which we didn't even get to, because the program crashed too soon.

    私たちもに到達しなかった、なぜなら プログラムは、あまりにも早く墜落した。

  • But if we were to fix this, what effect does doing y equal x have?

    しかし、私たちはこれを修正した場合、どのような 効果をyに等しいxは持ってやっていますか?

  • Well, it essentially points y at whatever value x is pointing at.

    まあ、それは本質的でyを指す どのような値xで指している。

  • >> So in Nick's story, or Binky's story, both

    >> だから、ニックの物語の中で、 両方またはBinkyの話、

  • x and y were pointing at the white chunk of memory,

    xおよびyは指し示すた メモリの白チャンク、

  • so that, finally, when you do star y equals 13 again,

    その結果、最終的に、ときに yが再び13になりスターんが、

  • you end up putting 13 in the appropriate location.

    あなたは13に入れてしまう 適切な場所。

  • So all of these lines are perfectly legitimate, except for this one,

    したがって、これらのラインの全てが完璧です これを除いて、正当な、

  • when it happened before you actually assigned y some value.

    それはあなたの前に起こったとき 実際にyのいくつかの値が割り当てられています。

  • >> Now thankfully, you don't have to reason through all

    >> さて、ありがたいことに、はしないでください すべてを通して推論する必要があります

  • of these kinds of issues on your own.

    ご自身での問題、これらの種類の。

  • Let me go ahead and open up a terminal window here

    私が先に行くと開いてみましょう ここでターミナルウィンドウまで

  • and open up, for just a moment, a super short program that

    とちょっと、開く、 スーパーショートプログラムもの

  • also is sort of pointless.

    また、ソートの無意味です。

  • It's ugly.

    それは醜いです。

  • It doesn't achieve anything useful.

    それは便利な何かを達成しない。

  • But it does demonstrate issues of memory, so let's take a look.

    しかし、それは問題を示さない メモリが、それでは見てみましょう。

  • >> Main, super simple.

    >> 超簡単、メイン。

  • It apparently calls a function, f, and then returns 0.

    これは、明らかに関数を呼び出し、 fは、その後、0を返します。

  • It's kind of hard to mess this up.

    それは台無しこれまでに種のは難しい。

  • So Main is pretty good, so far.

    だから主は、これまでのところ、かなり良いです。

  • >> So f is problematic.

    >> それでfは問題である。

  • And just didn't put much effort into naming it

    そして、ちょうど多くを入れていない それに名前を付けるに努力

  • here, to keep the focus on the code.

    ここでは、コードにフォーカスを維持する。

  • f has two lines.

    fは2つの行を持っています。

  • And let's see what's now going on.

    そして今度は、何が起こっているのか見てみましょう。

  • So on the one hand here-- and let me make

    だから、一方では here--と私は作ってみよう

  • this consistent with the previous example-- on the one hand,

    以前、この一貫性のある 、一方ではexample--

  • the left-hand side is doing what, in English?

    左側は 英語で、何をやって?

  • It is--

    それはis--

  • AUDIENCE: Creating a pointer.

    聴衆:ポインタを作成します。

  • DAVID J. MALAN: Creating a pointer to an int and calling it x.

    DAVID J.マラン:ポインタの作成 int型であり、Xと呼ん。

  • So it's creating one of those boxes I keep drawing on the touch screen.

    だから、これらのボックスのいずれかを作成することだ 私は、タッチスクリーン上に描画し続ける。

  • And now, on the right-hand side, malloc, of course,

    そして今、右手上 側、malloc関数はもちろん、

  • is allocating a chunk of memory.

    メモリのチャンクを割り当てて。

  • And just to be clear, how much memory is it apparently

    そして、ちょうど明確にすることが、どのように 多くのメモリは、明らかにそれである

  • allocating, if you just kind of do the math here?

    ちょうどあなたと、割り当てる 種類のここで計算を行う?

  • >> So it's 40 bytes.

    >> だから、40バイトです。

  • And I know that only because I know an int, on the CS50 appliance, at least,

    そして、私は私が知っているという理由だけであることを知っている int型、CS50アプライアンス上、少なくとも、

  • is four bytes.

    4バイトです。

  • So 10 times 4 is 40.

    だから、10回4は40です。

  • So this is storing an x, the address of the first out of 40 ints that

    だから、これは、X、アドレスを記憶している その40 intのうち最初の

  • have been allocated space back, to back, to back, to back.

    バックスペースを割り当てられている、 、背中合わせにするために、バックアップする。

  • >> And that's what's key about malloc.

    >> そして、それはmalloc関数に関する重要だものだ。

  • It doesn't take a little memory here, a little here, a little here.

    これは、少ないメモリを取りません ここでは、ここで少し、少しここに。

  • It gives you one chunk of memory, contiguously, from the operating

    それはあなたのメモリの一塊を与え、 連続して、営業から

  • system.

    システム。

  • >> Now what about this, x bracket 10 equals 0?

    >> 今、この約何、 Xブラケット10は0に等しい?

  • Arbitrary line of code.

    コー​​ドの任意の行。

  • It doesn't achieve anything useful.

    それは便利な何かを達成しない。

  • But it is interesting, because x bracket 10--?

    しかし、それは面白いです、 Xブラケット10--理由?

  • Yeah?

    うん?

  • >> AUDIENCE: [INAUDIBLE]?

    >> 聴衆:[聞き取れない]?

  • >> DAVID J. MALAN: x bracket 10 doesn't have to be null.

    >> DAVID J.マラン:Xブラケット 10はNULLである必要はありません。

  • The null detail only comes into play with strings, at the end of a string.

    ヌルディテールだけで場に出る 文字列を持つ、文字列の末尾に。

  • But a good thought.

    しかし、よく考えて。

  • >> How big is this array, even though I've allocated 40 bytes?

    >> この配列はさらに、どのように大きいです 私は、40バイトが割り当てられてきたものの?

  • It's 0 through nine, right?

    それは右、9 0〜ですか?

  • It's 10 ints, total.

    それは10のint、合計です。

  • 40 bytes, but 10 ints, indexed 0 through 0.

    40バイトが、10 int型、 0 0からインデックス付き。

  • >> So what is that x bracket 10?

    >> だからのxブラケット10は何ですか?

  • It's actually some unknown garbage value.

    それは実際にいくつかの 未知のごみ値。

  • It's memory that doesn't belong to me.

    それは私に属していないメモリです。

  • I should not be touching that byte number 41, 42, 43, 44.

    私はあることに触れすべきではない バイト数は41、42、43、44。

  • I'm going slightly too far.

    私はあまりにも遠く少しつもりです。

  • >> And indeed, if I run this program, it might very well crash.

    >> そして実際、私はこれを実行した場合 プログラムは、それは非常によくクラッシュする可能性があります。

  • But sometimes, we'll get lucky.

    しかし、時には、私たちは幸運取得します。

  • And so just to demonstrate this-- and frankly,

    そして、これだけ実証する this--と率直に言って、

  • you never know before you do it-- let's run this.

    あなたがあなたの前に知っていることはありません それでは、これを実行してみましょうit--ください。

  • It didn't actually crash.

    それは実際にクラッシュしていない。

  • >> But if I change this, for instance, to be like 1,000,

    >> しかし、私はこれを変更した場合、用 インスタンスは、1000のようになるために

  • to make this really deliberate, let's see

    本当にこれを作る 意図的な、見てみましょう

  • if we can get it to crash this time.

    私たちは、この時間をクラッシュさせる得ることができます。

  • OK, it didn't crash.

    [OK]を、それがクラッシュしていない。

  • How about 100,000?

    どのように約100,000?

  • Let's remake it, and now rerun it.

    のは、それをリメイクしましょう​​、そして今それを再実行します。

  • OK.

    [OK]をクリックします。

  • Phew.

    あー。

  • All right.

    かしこまりました。

  • So apparently, again, these segments of memory, so to speak,

    そこで明らかに、再び、これらの いわばメモリのセグメント、

  • are reasonably big, so we can get lucky again and again.

    私たちはできる、合理的に大きいです 何度も何度も幸運を得る。

  • But eventually, once you get ridiculous and really go far out on the screen,

    しかし、最終的には、一度あなたがばかげ取得 本当に、画面上で遠くに出かける

  • you touch memory that really, really doesn't belong to you.

    あなたは、本当にメモリに触れる 本当にあなたに属していません。

  • >> But frankly, these kinds of bugs are going

    >> しかし、率直に言って、これらの バグの種類がしようとしている

  • to be harder and harder to figure out on your own.

    難しくなるように 自分で把握できます。

  • But thankfully, as programmers, we have tools that allow us to do this for us.

    しかし、ありがたいことに、プログラマのように、私たちは持っている 私たちは私たちのためにこれを行うためのツール。

  • So this is, perhaps, one of the ugliest programs,

    だから、これは、おそらく、一つです 醜いのプログラム、

  • even uglier than gdb's output.

    GDBの出力よりもさらに醜い。

  • But it always has a line or two that are super useful.

    しかし、それは常に行を持つか 超便利2アール。

  • >> Valgrind is a program that helps you not debug a program, per se,

    >> Valgrindのは役立つプログラムです あなたがプログラムをデバッグしない、それ自体、

  • but find memory-related problems, specifically.

    が、メモリ関連の発見 問題は、具体的に。

  • It will automatically run your code for you and look for at least two things.

    それは自動的にあなたのコードを実行します あなたと、少なくとも2つのものを探す。

  • One, did you do something accidental like touch memory

    一方、あなたが何かをしましたか タッチメモリのような偶発

  • that didn't belong to you?

    それはあなたに属していたのですか?

  • It will help you find those cases.

    それはあなたがこれらのケースを見つけましょう。

  • >> And two, it will help you find something called

    >> そして2、それが役立つ あなたはと呼ばれるものを見つける

  • memory leaks, which we have completely ignored, naively,

    私たちが持っているメモリリーク、 完全に無視、単純に、

  • for some time and blissfully.

    しばらくして穏やか。

  • But it turns out, all this time, whenever

    しかし、それはすべて、判明 今回は、いつでも

  • you've called getString in so many of our programs,

    あなたはgetStringメソッドで呼び出されました 私たちのプログラムのように多くの、

  • you're asking the operating system for memory,

    あなたは営業を求めている メモリのためのシステム、

  • but you have any recollection of ever giving it

    しかし、あなたはどんな思い出を持っている 今までそれを与える

  • back, doing unalloc, or free, as it's called.

    背中、UNALLOCをやったり、 自由、それは呼ばれるように。

  • No, because we've never asked you to do so.

    いいえ、私たちは初めてだしないため、 そうするように頼んだ。

  • >> But all this time, the programs you've been writing in C

    >> しかし、すべてのこの時間、プログラム あなたがC言語で書いてきた

  • have been leaking memory, asking the operating

    メモリリークされてきた、 運転を求めて

  • system for more and more memory for strings and whatnot,

    より多くのためのシステム 文字列やその他もろもろのためのメモリ、

  • but never handing it back.

    が、それをバック渡すことはありません。

  • And now this is a bit of a oversimplification,

    そして今、これは少しある 単純化の、

  • but if you've ever run your Mac or your PC for quite some time, opening

    しかし、あなたがあなたのMacまたはを実行してしまった場合 かなりの時間、開放のためにPC

  • lots of programs, maybe closing programs,

    プログラムの多く、 多分、プログラムを終了

  • and even though your computer hasn't crashed,

    とにもかかわらず、あなたの コンピュータがクラッシュしていない、

  • it's getting so much slower, as though it's really

    それは、そんなに遅いなってきた それは本当にだかのように

  • using a lot of memory or resources, even though,

    大量のメモリを使用するか、 リソース、たとえ、

  • if you're not even touching the keyboard,

    あなたもいないのであれば キーボードに触れ、

  • that could be-- but not always-- could be that the programs you're running

    それはalways--なかっbe--が、できませんでした あなたが実行しているプログラムのことである

  • have themselves memory leaks.

    それ自体がメモリリークを持っている。

  • And they keep asking the OS for more and more memory, but forgetting about it,

    そして、彼らはますますのOSを求めておく より多くのメモリが、それを忘れ、

  • not actually using it, but therefore taking memory away

    実際に、それを使用していないが、 したがって、離れてメモリを取って

  • from other programs that might want it.

    それをする可能性のある他のプログラムから。

  • So that's a common explanation.

    だから、一般的な説明です。

  • Now here's where Valgrind's output is completely

    今ここにどこValgrindの者です 出力は完全に

  • atrocious to those less and more comfortable alike.

    少ないものに凶悪な 同様に、より快適。

  • But the interesting stuff is right up here.

    しかし、興味深いの スタッフはここまでです。

  • It is telling me an invalid write of size four happens in this program,

    それは私の無効な書き込みを語っている サイズ4は、このプログラムに起こる

  • in particular, at line 21 of memory.c.

    特に、のmemory.cの21行で。

  • >> If I go to line 21, hm, there indeed is an invalid write of size four.

    >> 私はHM、そこに確かに、21行目に移動した場合 サイズ4の無効な書き込みである。

  • Why size four?

    なぜサイズ4?

  • Well, this number-- and it could be anything-- is an int.

    さて、このnumber--、それ intでanything--である可能性があります。

  • So it's four bytes.

    だから、4バイトです。

  • So I'm putting four bytes where they don't belong.

    だから私は、4バイトを入れている どこに属していない。

  • That's what Valgrind is actually telling me.

    それはどのようなValgrindのだ 実際に私に言っている。

  • Moreover, it will also tell me, as we'll see,

    さらに、それはまた、意志 私たちが見るよう、私に教えて、

  • as you run this in a future pset, if and when you've leaked memory, which indeed

    あなたがあれば、将来のpsetでこれを実行するようにし、 あなたが実際にメモリをリークしてきたとき

  • I have, because I've called malloc, but I haven't actually

    私が呼んでいるので、私は、持っている malloc関数が、私は実際には持っていない

  • called, in this case, free, which we'll eventually see

    フリー、この場合には、いわゆる その私たちが最終的に表示されます

  • is the opposite of malloc.

    malloc関数の逆です。

  • >> So now, I think, a final example.

    >> だから今、私は、最後の例だと思います。

  • So this one's a little more arcane, but it's perhaps

    したがって、この1はもう少しだ 難解な、そ​​れはおそらくです

  • the biggest reason to be careful with memory,

    への最大の理由 メモリに注意して、

  • and the reason that many programs and/or web servers, even to this day,

    そして理由は、多くのプログラム および/またはWebサーバも、この日に、

  • are taken over by bad guys somewhere on the internet who are somehow

    どこかで悪者に引き継がれている 何とかあるインターネット上の

  • sending bogus packets to your server trying to compromise your accounts,

    サーバーに偽のパケットを送信する あなたのアカウントを侵害しようとすると、

  • or take your data, or just generally take over a machine.

    またはちょうどあなたのデータを取るか、 一般的にマシンを引き継ぐ。

  • Buffer overflow, as the name suggests, means

    バッファオーバーフローなど 名前は、手段を示唆している

  • overflowing not an int, but a buffer.

    ではないのintが、バッファのオーバーフロー。

  • And a buffer is just a fancy way of saying it's a bunch of memory.

    そして、バッファは変わった方法である それはメモリの束だと言っている。

  • >> And indeed, I called a string before buffer, instead of s.

    >> そして実際、私は、文字列と呼ばれる バッファの前に、代わりにsの。

  • Because if it's a buffer, like in the YouTube sense,

    それはバッファの場合にはそのため、 YouTubeの意味でのように、

  • or any time you're watching a video, you might have seen the word buffering,

    またはビデオを監視していますいつでも、 あなたが単語のバッファリングを見たかもしれない、

  • dot, dot, dot.

    ドットドットドット。

  • It's incredibly annoying.

    それは信じられないほど迷惑なんだ。

  • And that just means that your video player

    そして、それはただの手段 そのあなたのビデオプレーヤー

  • is trying to download lots of bytes, lots of bytes

    多くをダウンロードしようとしている バイト、バイトの多くの

  • from a video from the internet.

    インターネットからのビデオから。

  • But it's slow, so it's trying to download a bunch of them

    しかし、それは遅いですので、それはしようとしている それらの束をダウンロードする

  • to fill a buffer, a container, so that you have enough bytes that it can then

    その結果、バッファ、コンテナを埋めるために あなたはそのことが次にでき十分なバイトを持つ

  • show you the video, without pausing constantly.

    あなたのビデオを表示、 常に一時停止せずに。

  • But it turns out, you can have a buffer to this big.

    しかし、それはあなたができる、判明 この大きなバッファを持っています。

  • But try to put this much data in it, and very bad things can happen.

    しかし、この多くのデータを配置しよう それは、非常に悪いことが起こる可能性があります。

  • So for instance, let's look at this final teaser of an example.

    例えばそれでは、見てみましょう 例のこの最後のティーザー。

  • This is another program that, at first glance,

    これは、別のプログラムであり、 その、一見、

  • doesn't do anything super useful.

    超便利何もしない。

  • It's got a Main function that calls that function, f.

    これは、主な機能を持っている それをf、その関数を呼び出します。

  • And that function, f, up here, has a char array, called c, of size 12.

    そして、その関数は、fは、ここまで、あります サイズ12のCと呼ばれる文字配列、、。

  • And then it's using this new function called strncpy.

    その後、これを使っている 新しい関数はstrncpyを呼ばれる。

  • >> It turns out that, with this simple, simple line of code, just two lines,

    >> それは、この単純で、ことが判明 コー​​ドの単純な線、わずか2行、

  • we have made my entire program, and therefore, my entire computer,

    私たちは、私の全体のプログラムを行っている そのため、私の全体のコンピュータ、

  • and my user account, and my hard drive potentially vulnerable to anyone

    と私のユーザーアカウント、および私のハード 誰にも潜在的に脆弱ドライブ

  • who knows and is good enough to run this program with a certain command line

    誰が知っているし、実行するのに十分に良好である 特定のコマンドラインでこのプログラム

  • argument.

    引数。

  • In other words, if this bad guy puts inside of argvargv[1] by typing

    換言すれば、この悪いやつ 次のように入力してargvargv [1]の中に入れます

  • at the keyboard a very specially crafted string, not abc, 123, but essentially,

    非常に特別な細工がされたキーボードで 文字列ではなく、ABC、123、しかし本質的に、

  • binary symbols that represent executable code, a program that he or she wrote,

    実行可​​能ファイルを表すバイナリシンボル コー​​ド、彼または彼女が書いたプログラムを、

  • with this simple program, which is representative of thousands of programs

    で、この単純なプログラムと プログラムの何千人もの代表

  • that are similarly vulnerable, daresay, he or she can ultimately delete all

    、あえて言う同様に脆弱であること、 彼または彼女は最終的にすべてを削除することができます

  • the files on my hard drive, get a blinking prompt so that he or she can

    私のハードドライブ上のファイルは、取得 彼または彼女ができるように、プロンプトを点滅

  • type commands on their own, email all files to myself.

    自分でコマンドを入力し、 自分自身にすべてのファイルを電子メールで送信。

  • Anything that I can do, he or she can do with this code.

    私が何かできることは、彼 または彼女は、このコードで行うことができます。

  • >> We won't quite solve this yet.

    >> 私たちは、非常にまだこれを解決することはできません。

  • And in fact, it's going to involve a little picture

    そして、実際に、それはに起こっている 小さな画像を伴う

  • like this, which we'll soon come to understand all the better.

    このように、私たちはすぐに来るよこれ すべてをよりよく理解する。

  • But for today, let's end on what's, hopefully, a slightly more

    しかし、今日のために、の上で終わらせて うまくいけば何の、やや

  • understandable XKCD joke, until we resume next time.

    理解できるXKCDジョーク、 私たちは次の時間を再開するまで。

  • All right.

    かしこまりました。

  • See you on Wednesday.

    水曜日にお会いしましょう​​。

  • >> [MUSIC PLAYING]

    >> [音楽再生]

  • >> SPEAKER: And now, deep thoughts, by Daven Farnham.

    >> スピーカー:そして今、深い 祈るファーナムによる思考、。

  • Memory is like jumping into a pile of golden leaves on a Sunday afternoon.

    メモリがの山に飛び込むようなものです 日曜日の午後に金色の葉。

  • Wind blowing, tossing your hair-- oh, I miss the days when--

    風あなたを投げ、吹い ああhair--、私は日when--欠場

  • >> [LAUGHTER]

    >> [笑い]

[MUSIC PLAYING]

[音楽再生]

字幕と単語

ワンタップで英和辞典検索 単語をクリックすると、意味が表示されます