字幕表 動画を再生する 字幕スクリプトをプリント 翻訳字幕をプリント 英語字幕をプリント [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] >> [笑い]
B1 中級 日本語 アドレス メモリ マラン 文字 関数 入力 第5週 (Week 5) 1015 59 Amy.Lin に公開 2021 年 01 月 14 日 シェア シェア 保存 報告 動画の中の単語