[MUSIQUE LECTURE]
>> DAVID J. Malan: Très bien.
C'est CS50.
Et c'est le début de la semaine 5.
Et comme vous avez pu le remarquer, une partie du matériau
est d'obtenir un peu plus complexe, le petit plus dense.
>> Et il est très facile, surtout si vous avez été dans l'habitude depuis un certain temps,
pour essayer de griffonner plus tout ce que nous faisons, nous disons en classe.
Mais se rendre compte, c'est peut-être pas l'approche pédagogique idéal
à l'apprentissage de ce type de matériel, et plus généralement la matière.
Et si nous sommes heureux d' annoncer propre Gheng de ce CS50
Gong a commencé à préparer un ensemble canonique de notes
pour le cours, l'espoir d' qui est que, un, ceux-ci
non seulement servir de référence et une ressource
d'examiner les matériaux et va à travers un matériau qui pourrait avoir
vous échappé la première fois, mais aussi pour que vos têtes peuvent être plus
haut que vers le bas, quand il vient le temps de donner des conférences,
de sorte que vous pourriez engager plus réfléchie, comme
contre plus scribbly.
>> Cela dit, ce que vous trouverez sur le site est de ces documents de ce genre.
Et remarquez, en haut à gauche, il ya non seulement une table des matières,
mais aussi les codes temporels que immédiatement vous sauter
à la partie appropriée dans la vidéo en ligne.
Et ce que Chang a fait ici est, pour l'essentiel, documentées
ce qui s'est passé dans ce particulier conférence.
Et la plupart des conférences sont déjà en ligne maintenant avec cette URL.
Et nous allons continuer à poster le reste de ceux de la fin de la semaine,
il ne faut profiter de cette ressource.
>> Alors sans plus tarder, nous avons commencé à décoller
la couche qui a été chaîne pendant un certain temps.
Et qu'est-ce que nous disons une chaîne est en fait la semaine dernière?
Donc étoiles car.
Et l'omble étoiles, et bien, ce est-ce que cela signifie vraiment?
Eh bien, tout ce temps, si nous avons été appeler une fonction,
comme getString, et le stockage le retour que l'on appelle
La valeur de getString dans un variable-- ça s'appelle
Type de s string-- nous avons écrit la ligne de code là-haut.
Et c'est seulement quand je vois mon écriture magnifié ici
dois-je me rends compte à quel point cela est atroce.
>> Cependant, supposons que, sur le côté droit
est, néanmoins, un délai raisonnable représentation de ce qui est
se passe sur tout ce temps avec getString.
getString, bien sûr, obtient une chaîne.
Mais qu'est-ce que cela signifie réellement?
Cela signifie qu'il obtient un morceau de à partir de la mémoire du système d'exploitation
en appelant une fonction, appelé malloc.
Mais plus sur cela plus tard.
Et puis il remplit ce morceau de mémoire
avec les lettres que l'utilisateur dispose d' tapé, suivie, bien sûr,
un caractère nul, ou barre oblique inverse zéro à la fin.
>> Pendant ce temps, sur le côté gauche de cette histoire, tout ce temps,
nous avons déclarons une variable, comme l'art.
Et que cette variable est ce maintenant va commencer à appeler un pointeur.
Ce n'est pas une boîte à l'intérieur de laquelle nous avons mis la chaîne, Daven, en soi,
mais nous avons mis en place que encadré sur la gauche quoi exactement?
Ouais?
>> PUBLIC: L'adresse de la où il se trouve dans la mémoire.
>> DAVID J. Malan: Exactement.
L'adresse de l'endroit où Daven se trouve dans la mémoire.
Et pas où tous Daven est situé, en soi, mais précisément l'adresse
de quoi?
Ouais?
>> AUDIENCE: Le premier caractère.
>> DAVID J. Malan: Le premier caractère dans Daven, qui, dans ce cas,
Je proposée a été arbitrairement et irréaliste 1, Ox1,
ce qui signifie que la nombre hexadécimal de 1.
Mais il va probablement être un beaucoup plus grand nombre
que nous pourrions tirer avec un 0x comme préfixe,
représentant un caractère hexadécimal.
Et parce que nous n'avons pas besoin de savoir où le reste des personnages de Daven
sont, à cause de ce design simple décision qui a été faite il ya de nombreuses années?
Ouais?
>> PUBLIC: Backslash 0.
DAVID J. Malan: Oui, exactement.
La barre oblique inverse 0 vous permet, bien que dans temps linéaire, pour traverser la chaîne,
marcher de gauche à droite, avec une boucle, ou un certain temps
boucle, ou quelque chose comme que, et déterminer, oh, ici
est la fin de cette chaîne particulière.
Donc, avec juste l'adresse à le début d'une chaîne,
nous pouvons accéder à l'intégralité du , parce que pendant tout ce temps,
une chaîne vient d'être une star char.
>> Donc, c'est certainement bien de continuer à utiliser la bibliothèque de CS50 et cette abstraction,
pour ainsi dire, mais nous allons commencer à voir exactement
ce qui se passe dessous tout ce temps.
Vous pouvez donc rappeler cet exemple, aussi, la dernière fois, comparez 0,
qui n'a pas réellement comparer.
Mais nous avons commencé à résoudre ce problème.
>> Mais, comme peut-être un cours de recyclage, Je pourrais intéresser quelqu'un
dans un éléphant rose aujourd'hui, également faite par Chang?
Que diriez-vous en face? [Inaudible].
Venez sur place.
>> Et dans l'intervalle, comme vous venez, nous allons
considérer pour un instant ce que ce code a été effectivement fait.
Il a déclaré deux variables en haut, s et t, et appelant getString.
Ce n'est pas un programme très convivial, car il ne vous dit pas ce qu'il faut faire.
Mais disons simplement supposons que nous sommes en se concentrant sur la partie juteuse.
Et puis nous faisons, si s est égal à est égale à t, il faut dire printf,
que vous avez saisi la même chose.
Bonjour.
Quel est votre nom?
>> JANELLE: Janelle.
DAVID J. Malan: Janelle, Ravi de vous rencontrer.
Donc, votre défi à main pour cet éléphant
est d'abord de nous dresser un tableau de ce qui est être représenté dans les deux premiers
lignes.
Donc, s et t peut être représentée faire sur l'écran?
Et vous pouvez simplement dessiner avec le doigt sur ce grand écran.
>> Donc, il ya deux moitiés à de chaque côté de cette équation.
Il ya donc de la gauche, et alors GETSTRING sur la droite.
Et puis il ya t sur la gauche, puis GETSTRING sur la droite.
Alors, comment pouvons-nous commencer un dessin qui
représente ce qui se passe ici en mémoire, diriez-vous?
Et permettez-moi de vous laisser expliquer ce que vous faites comme vous allez.
>> JANELLE: OK.
Eh bien, tout d'abord, il serait demandé vous obtenez la chaîne d'entrée.
Et il serait store-- oh, désolé.
DAVID J. Malan: OK.
Bon.
Et c'est ce qu'on appelle quoi?
Oh, OK.
Continuer.
Je ne voulais pas vous interrompre.
JANELLE: Désolé.
Donc, il serait entrée en l'adresse de-- pas sûr.
Je ne me souviens pas précisément le nombre, mais je crois qu'il commençait à 0.
>> DAVID J. Malan: C'est tout droit, parce que j'ai fait les nombres jusqu'à,
donc il n'y a pas de bonne réponse.
>> JANELLE: À partir du 0 arc.
>> DAVID J. Malan: OK, alors l'élément 0.
Bien sûr.
>> JANELLE: Et puis si c'était comme seulement deux letter--
>> DAVID J. Malan: OK, de nouveau à vous.
>> JANELLE: Donc, l'élément 0, et alors l'élément 1 ou 2 élément.
DAVID J. Malan: Et quelle pièce de l'image que tu dessine en ce moment?
L'appel à getString?
Ou de la déclaration de l?
>> JANELLE: La déclaration de s, je crois.
Oh, la getString, car il serait être introduite dans chaque [? zone. ?]
>> DAVID J. Malan: Bon.
Exactement.
Même si ce efficace retourne un tableau, rappel,
quand nous serons de retour une chaîne, nous pouvons index dans cette chaîne en utilisant 01 et 2.
Techniquement, ce sont probablement représentées par des adresses individuelles,
mais c'est très bien.
>> Supposons donc que, si je peux seulement rapide transmettre à l'endroit où nous nous sommes quittés
la dernière fois, si l'un des les cordes était un b g e,
barre oblique inverse 0, représentant ainsi Gabe entrée, comment pourrions-nous représenter s maintenant?
Si c'est la mémoire qui est été renvoyée par getString?
>> JANELLE: Serait-il représenté par un arc?
>> DAVID J. Malan: Par un arc?
Eh bien, non.
Disons simplement, imagée, laissez-moi juste aller de l'avant
et de proposer que, si ce n'est l, ce est la valeur de retour de getString.
Et vous avez dessiné cette valeur à 0, 1, 2, est tout à fait raisonnable, parce que nous
peut indexer dans la chaîne, en tant que tel.
Mais juste pour être compatible avec la dernière fois, laissez-moi aller de l'avant
et proposer arbitrairement que ce est l'adresse 1, c'est l'adresse 2,
cette adresse est 3, et ainsi de suite.
Et si, juste pour être super clair, ce qui se passe
aller à l'art à la suite de cette première ligne de code, diriez-vous?
>> JANELLE: Adresse 1?
>> DAVID J. Malan: Exactement.
Donc aborder 0x1.
Et pendant ce temps, laissez-moi aller de l'avant et reproduire une grande partie de ce que vous avez fait
et ajouter mon propre t ici.
Si je devais taper gabe de plus, une seconde fois,
lorsque vous êtes invité à getString, où, bien sûr, est gabe va aller?
Eh bien, presumably--
>> JANELLE: Comme ici?
DAVID J. Malan: Ouais.
JANELLE: Ou c'est aussi dans les mêmes boîtes?
DAVID J. Malan: Permettez-moi propose, ouais, exactement, si dans ces boîtes supplémentaires.
Mais ce qui est essentiel maintenant, c'est que, même si j'ai dessiné ces assez proche
together-- 0x1, ce 0x2-- est en réalité,
ce pourrait maintenant être adresse 0x10, par exemple, et 0x11, 0x12 et,
et ainsi de suite.
Et donc, si c'est le cas, ce qui va se finir ici en t?
>> JANELLE: 0x10?
DAVID J. Malan: Exactement.
Donc 0x10.
Et maintenant, la question finale.
Vous avez, de loin, a dû travailler la plus difficile pour un éléphant à ce jour.
Maintenant, si je tire le code encore une fois, quand je fais, à la troisième ligne,
si s est égal à égal t, ce que je suis réellement la comparaison que nous avons attirés ici?
>> JANELLE: Les deux adresses?
DAVID J. Malan: Exactement.
Donc, je veux dire, c'est S égal égal à t?
En d'autres termes, est égal à 1 égal à 10?
Et bien sûr, la réponse évidente est maintenant, non.
Et si ce programme est en fin de compte va imprimer ce, diriez-vous?
>> JANELLE: Serait-il, que vous avez saisi la même chose?
>> DAVID J. Malan: Donc, si s est égal à 1 et t est de 10?
>> JANELLE: Vous avez tapé des choses différentes.
>> DAVID J. Malan: Exactement.
Vous avez tapé des choses différentes.
Bien.
Donc, une salve d'applaudissements, si nous le pouvions, ici.
[Applaudissements]
C'était douloureux.
Je sais.
Bien fait.
Alors maintenant, nous allons voir si nous ne pouvons pas démêler ce que le correctif a été.
Et bien sûr, quand nous avons fixé this-- que je vais maintenant représente dans green--
nous avons fait quelques améliorations ici.
Tout d'abord, comme une santé mentale vérifier, je suis d'abord vérifier
si s est égal à zéro et t est égal à zéro.
Et juste pour être clair, quand pourrait s ou t être nulle dans le code comme ça?
Lorsque pourraient s ou t nulle.
Ouais?
>> PUBLIC: [inaudible].
>> DAVID J. Malan: Exactement.
Si la chaîne que l'utilisateur tapé est trop long
pour tenir dans la mémoire, ou une étrange cas du coin comme ça,
GETSTRING, comme nous le verrons, littéralement aujourd'hui, dans sa documentation,
dit qu'il sera de retour comme nulle une valeur particulière de sentinelle,
ou tout simplement une sorte de symbole spécial cela signifie que quelque chose n'allait pas.
Donc, nous voulons vérifier que, car il s'avère
que nulle est une valeur très dangereux.
>> Souvent, si vous essayez de faire quelque chose avec null impliquant un function-- passer
comme entrée, pour que la fonction instance-- pourrait très va se planter et, avec elle,
prendre vers le bas de votre programme ensemble.
Donc, cette troisième ligne est maintenant juste un bon sens vérifier, vérification d'erreur, si vous voulez.
C'est une bonne habitude maintenant nous obtenons en tout temps nous
essayez d'utiliser une valeur qui pourrait, éventuellement, être nul.
>> Maintenant, dans la quatrième ligne ici, "Si strcmp (s, t)," bien,
c'est quoi parler?
Eh bien, nous dit que c'était un très succinctement fonction nommée pour la comparaison de chaînes.
Et son but dans la vie est de comparer son premier argument contre elle seconde,
mais pas en fonction de leurs adresses, comme nous l'avons fait sans le vouloir un moment
Il ya avec le code rouge, mais plutôt de comparer ces deux
chaînes de la humainement intuitive en comparant cette façon, contre cela,
contre cette contre cela, et puis s'arrêtant si et quand on
ou les deux de mes doigts frappe une barre oblique inverse 0.
Strcmp Donc il ya quelqu'un ans mis en œuvre à mettre en œuvre pour nous la fonctionnalité
que nous espérions, nous aurions obtenu simplement en comparant deux valeurs simples.
>> Maintenant, franchement, je garde le dessin tous ces différents numéros.
Mais la réalité, c'est que j'ai été faire cela en compte tout le temps.
Et laissez-moi juste aller de l'avant et gribouiller ces hors
pour faire un point qui, à la fin de la journée et aller de l'avant,
nous ne sommes pas vraiment à se soucier ce qui porte les choses sont en fait
dans la mémoire.
Donc, je ne vais pas tirer de ces types de numéros tellement anymore,
Je suis juste un résumé de cette distance un peu plus convivial avec seulement flèches.
>> En d'autres termes, si s est un pointeur, bien, disons simplement le dessiner, littéralement,
comme un pointeur, une flèche pointant de lui-même à quelque chose d'autre,
et pas trop de soucis plus sur la minutie de ces adresses
qui, encore une fois, j'ai fait de toute façon.
Mais nous allons voir ces adresses, parfois, quand le débogage du code.
>> Maintenant, quant à lui, ce programme ici correctifs, bien sûr,
ce problème en comparant ces deux chaînes.
Mais nous avons eu un autre problème.
Ce fut à partir de la copie programmer la dernière fois,
laquelle, j'ai essayé de capitaliser que le premier caractère d'une chaîne.
Mais ce qui était le symptôme nous avons vu la dernière fois que
un utilisateur a tapé dans une valeur, comme gabe en minuscules, pour s,
alors nous avons attribué s en t, comme dans la troisième ligne y,
et puis j'ai essayé de capitaliser t support 0?
Quel était l'effet de changer t support 0 ici?
>> PUBLIC: Il a changé art.
>> DAVID J. Malan: Ouais, J'ai changé de ainsi.
Parce que ce qui se passait vraiment?
Eh bien, permettez-moi de voir si je peux nettoyer cette image, comme suit.
>> Si s est, encore une fois, le mot g, a, b, e, barre oblique inverse, 0, et s
nous allons continuer dessin comme une boîte ici, mais pas plus d'adresses.
Arrêtons de faire les choses.
Disons simplement dessiner une image pour simplifier le monde.
>> Quand je déclare t avec de la ficelle t, qui crée ce morceau de mémoire.
Place se trouve être 32 bits dans la plupart des ordinateurs.
En fait, si vous avez déjà entendu parler d'un ordinateur ayant une architecture à 32 bits,
vraiment envie de parler-, qui vient signifie qu'elle utilise des adresses de 32 bits.
Et comme une technique de côté, si vous êtes déjà demandé
pourquoi les ordinateurs plus anciens, si vous avez réellement essayé de soupe entre eux avec beaucoup de RAM,
ne pouvait avoir un maximum de quatre gigaoctets de RAM,
bien que c'est parce que, littéralement, votre ancien ordinateur ne pouvait
compter jusqu'à 4 milliards, 4 milliards d'octets,
car il a été l'aide de 32 bits numéros d'adresses.
>> Mais en tout cas, en ce exemple, de l'histoire beaucoup plus simple.
t est juste un autre pointeur, ou vraiment une star de char, aka chaîne.
Et comment puis-je veux mettre à jour cette image maintenant avec cette deuxième ligne de code,
après la virgule, point, point?
Quand je fais chaîne t est égale à s-virgule, comment changer cette image?
Ouais?
>> PUBLIC: [inaudible].
>> DAVID J. Malan: Ouais.
Exactement.
Je viens de mettre une flèche de la t boîte à la même adresse,
la même première lettre a.
Ou techniquement, si ce gars étaient encore au 0x1,
c'est comme si j'avais 0x1 et 0x1 ici ici.
Mais encore une fois, qui se soucie sur les adresses?
C'est juste l'idée qui compte maintenant.
Donc, c'est ce qui se passe ici.
Alors bien sûr, si vous faites t support 0, ce qui est une notation de tableau,
de course-- et franchement, il semble comme il ya un tableau ici,
mais maintenant il ya cette chose étrange.
Sachez que le langage de programmation, C, vous offre cette fonctionnalité,
de sorte que, même si t est un pointeur, ou s est un pointeur,
vous pouvez toujours utiliser familier, crochet confortable
notation d'aller au premier élément, ou le deuxième élément, ou un élément
que ce pointeur pointe à cause, sans doute, il
est, comme dans ce cas, pointant à un tableau.
>> Alors, comment pouvons-nous résoudre ce problème?
Franchement, c'est là où il a obtenu un peu écrasante au premier abord.
Mais voici une version nouvelle et améliorée.
>> Alors d'abord, je suis en train de débarrasser de la bibliothèque CS50,
juste à exposer que l'art est en effet une étoile de char, juste un synonyme.
Et t est également une étoile char.
Mais ce qui se passe sur le droite de cette ligne
où t est attribuée une valeur?
>> Qu'est-ce que malloc?
Qu'est-ce que c'est strlen?
Qu'est-ce que sizeof (char)?
Pourquoi diable le fait regard de la ligne si complexe?
Que fait-il à un niveau élevé?
Qu'est-ce qu'il stockage en t?
Ouais?
PUBLIC: Il est l'attribution d'un certaine quantité d'espace mémoire.
C'est pour stocker, je suppose, lettres [inaudible].
>> DAVID J. Malan: Parfait.
Parfait.
C'est l'allocation d'un certain quantité d'espace de mémoire
pour stocker, vraisemblablement, lettres futurs.
Et en particulier, malloc est donc de retour ce?
>> PUBLIC: Retour de la [inaudible]?
DAVID J. Malan: Exactement.
Et renvoie l'adresse de cette mémoire, qui est une façon élégante de dire,
renvoie l'adresse de l' le premier octet de la mémoire.
Il incombe à me souvenir la quantité de mémoire que je fait
attribué ou demandé malloc pour.
>> Maintenant, combien est-ce?
Eh bien, même si il ya beaucoup d'entre parenthèses ici,
malloc prend un seul argument.
Et je suis en précisant strlen de s, afin de lui donner moi autant d'octets car il ya dans s,
mais en ajouter un.
Pourquoi?
Ouais?
>> PUBLIC: La barre oblique inverse 0.
DAVID J. Malan: Exactement.
Nous avons à faire un peu de ménage.
Donc, parce qu'il ya une barre oblique inverse 0, nous ferions mieux de se rappeler que.
Sinon, nous allons créer une chaîne de caractères qui
ne pas avoir cette terminaison spéciale.
>> Pendant ce temps, juste pour être super anal, j'ai sizeof (char),
juste au cas où quelqu'un lance mon Code pas sur l'appareil de CS50,
mais peut-être un autre ordinateur en tout cas les caractères
sont un octet, par convention, mais deux octets, ou quelque chose de plus grand que cela.
C'est juste pour être super, Super aversion aux erreurs.
Même si, en réalité, c'est plus susceptible d'être un 1.
>> Maintenant, quant à lui, je vais de l'avant et copier le chaîne, t support i est égale à t support s.
Et je vais m'en remettre à la semaine dernière de code source pour voir ce qui se passe.
Mais la livraison clé, et la raison pour laquelle je mis le code maintenant en vert,
C'est parce que dernière ligne, t support 0 est égal toupper,
a pour effet d' capitaliser quelle chaîne?
t et / ou s?
Cette dernière ligne de code.
>> Juste t, parce que ce qui est passé ce délai,
si je défais peu cette dernière étape, Ce qui s'est passé, quand je l'appelle malloc,
Je reçois essentiellement un bloc de mémoire qui est de la même taille que l'original,
parce que c'est l'arithmétique que j'ai fait.
Je suis le stockage en t l'adresse de ce morceau de mémoire.
Même si cela semble agréable et jolie, agréable et blanc,
la réalité est est là, ce que nous allons continuer à appeler, les valeurs d'ordures ici.
Ce morceau de mémoire pourrait très bien avoir été utilisé auparavant,
quelques secondes, il ya quelques minutes.
Il pourrait donc y avoir un nombre absolument ou des lettres là-bas, juste par accident.
Mais ils ne sont pas valables, jusqu'à ce que je me peuplent ce bloc de mémoire
avec les caractères réels, comme je l' faire dans cette boucle là.
Bien?
>> Alors maintenant, le point culminant de ces trois exemples
qui ont été apparemment cassé la dernière fois, cet exemple de swap, cette fonction
travaillé dans le sens qu'il échangé a et b.
Mais cela n'a pas fonctionné dans ce que les autres sens?
Ouais?
>> PUBLIC: [inaudible].
>> DAVID J. Malan: Exactement.
Si je devais appeler cette fonction de another-- par exemple,
d'une fonction comme principal, où J'ai une variable, x et y, comme je l'
fait la semaine dernière, même code, et je passe en x et y
Swap, et ensuite appeler Swap-- ce, bien sûr, c'est la bonne version
c'est ce que nous sommes sur le point de see-- cela n'a pas fonctionné.
Alors, quelle est la solution?
>> Eh bien, juste pour être clair, laissez-moi aller de l'avant
et-- me donner un seconde ici, et voir si je peux vous montrer la dernière, qui
sera in-- voyons si je peux trouver ce véritable OK fast--, [inaudible].
OK, il est là.
Donc ignorer les commandes, je suis juste de frappe.
Je veux récupérer à la dernière minute un exemple
la dernière fois, ce qui qui est maintenant appelé aucun échange.
>> Donc pas de swap est où nous nous sommes quittés la dernière fois,
grâce à quoi, je initialisé x 1 et y 2.
J'ai alors j'appelle Swap, passant en 1 et 2.
Et puis cette fonction travaillé dans un certain sens,
mais il n'avait pas permanent effectuer sur x et y.
Donc, la question qui se pose est de savoir comment maintenant pouvons-nous résoudre ce problème en fait?
Quelle est la solution à portée de main?
>> Eh bien, dans swap.c, ce qui est nouveau aujourd'hui, remarquer quelques différences.
x et y sont les mêmes.
Mais ce qui est clairement différente sur la ligne 25?
Quoi de neuf là-bas, si vous vous souvenez à quoi il ressemblait il ya une seconde?
>> PUBLIC: [inaudible].
>> DAVID J. Malan: Ouais.
Ainsi, les esperluettes sont une nouvelle pièce de syntaxe, non seulement dans ce programme,
mais aussi plus généralement dans CS50.
A ce jour, je ne pense pas nous avons vu des exemples
ou vraiment parlé de quelque détail, à l'exception, peut-être, de manière préventive
en coupe, une esperluette comme ça.
Eh bien, il s'avère esperluette est un des dernières pièces de la nouvelle syntaxe
nous allons apprendre.
Cela signifie tout simplement la adresse d'une variable.
À quelle adresse ne x vivent?
Mais ce ne vivent adresse y?
Parce que si la problème fondamental avant
été que x et y ont été passés que des copies, ce que nous voulons vraiment faire
est de fournir Swap avec comme un trésor carte qui mène à où x et y fait
sont en mémoire vive, de sorte que Swap peut suivre cette carte
et aller là où x ou y marque l'endroit et modifier les valeurs réelles 1 et 2
Là.
>> Donc Swap doit changer un peu trop.
Et à première vue, cela pourrait sembler un peu similaire à l'omble étoiles.
Et en effet il est.
Donc a est un pointeur sur ce type de données, basé sur cette partie surlignée?
C'est donc un int.
>> Donc un n'est plus un int, c'est l'adresse d'un int.
Et de même, b va maintenant être l'adresse d'un int.
Donc, quand je l'appelle maintenant Swap de Main, Je ne vais pas donner Swap 1 et 2.
Je vais donner comme Ox-chose et Ox-quelque chose,
deux adresses qui mèneront Swap de leurs emplacements réels
dans la mémoire de mon ordinateur.
>> Alors maintenant, que je reste la mise en œuvre a besoin de changer un peu.
Quel est évidemment différente maintenant dans ces trois lignes de code?
Il ya toutes ces foutues étoiles sur la place, d'accord?
Alors qu'est-ce qui se passe ici?
Ouais?
>> PUBLIC: C'est évidemment [inaudible].
>> DAVID J. Malan: Exactement.
Donc, dans ce context-- et ce n'était pas la meilleure décision de conception, il est vrai,
il ya des années.
Dans ce contexte, où vous avez juste une étoile,
et vous n'avez pas un type de données, comme int, immédiatement à gauche,
à la place vous avez un signe égal, clairement, dans ce contexte, quand vous dites que la vedette a,
cela signifie aller à l' adresse qui se trouve dans un.
Suivez la carte au trésor, pour ainsi dire.
>> Et pendant ce temps, dans la ligne 37, cela signifie la même chose.
Allez à l'adresse d'un, et mettre ce là?
Tout ce qui est à la emplacement qui spécifie b.
En d'autres termes, aller à b.
Obtenez cette valeur.
Aller à un et, par la même signer, l'opérateur d'affectation,
mettre cette valeur là.
>> De même, int temp est juste un int.
Rien ne doit changer au sujet de température.
C'est juste un verre de rechange de Annenberg pour un peu de lait ou de jus d'orange.
Mais je dois dire, aller à b.
Aller vers cette destination et mettre la valeur en température il.
Donc ce qui se passe alors?
Quand j'ai fait appeler Échangez ce moment, si ce premier plateau ici représente principal,
ce deuxième plateau représente Swap, quand Je passe esperluette x et y esperluette
de Main de Swap, juste pour être clair, quelle est cette pile cadre réception?
Ouais?
>> PUBLIC: [inaudible].
DAVID J. Malan: Exactement.
L'adresse de x et l'adresse de y.
Et vous pouvez penser de ces comme les adresses postales.
33 Oxford Street et 35 Oxford Street, et vous
vouloir déplacer les deux bâtiments qui sont à ces endroits.
>> C'est en quelque sorte d'une idée ridicule, mais c'est tout ce que nous entendons par adresse.
Où dans le monde peut vous trouverez ces deux entiers?
Où dans le monde pouvez-vous trouver ces deux bâtiments?
Donc, si enfin, après tout ce temps, je aller dans le code source d'aujourd'hui et de compiler
Swap and run ./swap, enfin, pour la première fois voyons-nous réellement que
mes valeurs ont en effet été échangés avec succès.
Et maintenant, nous pouvons même prendre note de cette, disons, gdb.
>> Donc, laissez-moi aller dans le même fichier.
Permettez-moi aller de l'avant et d'exécuter gdb de ./swap.
Et maintenant, en échange, je vais aller de l'avant et mettre un point d'arrêt dans Main.
Et maintenant, je vais aller avant et exécutez le programme.
Et maintenant, nous voyons mon code pause sur cette ligne.
>> Si je vais de l'avant et impression x, que dois-je voir ici?
C'est une question.
Dire encore?
>> PUBLIC: [inaudible].
>> DAVID J. Malan: Donc, nombres aléatoires, peut-être.
Peut-être que je suis chanceux, et c'est agréable et simple, comme 0.
Mais c'est peut-être un certain nombre aléatoire.
Dans ce cas, j'ai eu de la chance.
Il se trouve à 0.
Mais il s'agit bien de la chance, parce que pas jusqu'à ce que je
taper à côté, puis print x a que ligne de code, ligne 19, été exécuté.
>> Pendant ce temps, si je tape prochaine fois, et maintenant imprimer y, je vais voir 2.
Maintenant, si je tape prochaine, il va obtenir un peu confus, parce que maintenant,
printf va apparaître sur l'écran, comme il l'a fait. x est égal à 1.
>> Faisons-le à nouveau.
Et maintenant, voici où les choses deviennent intéressantes.
Avant d'appeler Swap ou même étape en elle, nous allons jeter un petit aperçu.
x est, de plus, une.
Y est, bien sûr, la santé mentale rapide vérifier, 2, donc pas difficile là-bas.
Mais ce qui est esperluette x?
Réponse, c'est un peu funky recherche.
Mais la star de int entre parenthèses est juste la manière de pib de dire que c'est une adresse.
Ce n'est pas un int, c'est un pointeur vers un int, ou autrement connu comme une adresse.
>> Quel est ce truc de fou?
Nous n'avons jamais vu quelque chose de tout à fait comme ça avant.
Donc, c'est l'adresse de mon ordinateur de mémoire de x qui arrive à vivre.
C'est Ox-chose.
Et c'est, franchement, pourquoi J'ai commencé à dessiner des flèches,
au lieu de chiffres, car qui se soucie vraiment
que votre int est un particulier adresse qui est très grand.
Mais bffff0c4, ce sont tous en effet chiffres hexadécimaux,
qui vont de 0 à f.
>> Donc, nous n'allons pas demeurer trop longtemps sur ce que sont ces choses.
Mais si j'imprime y, bien sûr, je vois 2.
Mais esperluette y, je vois cette adresse.
Et remarquez, pour les curieux, à quelle distance sont x et y?
Vous pouvez ignorer la plupart de l'adresse.
Quatre octets.
Et c'est conforme à notre demander plus tôt que la taille est un int?
Quatre octets.
Il semble donc que la doublure de tout jusqu'à bien, comme vous pouvez l'espérer, dans la mémoire.
>> Alors maintenant, nous allons juste avant rapide à la fin de cet article.
Allons de l'avant et tapez étape, de plonger dans la fonction de swap.
Maintenant, remarquez, si je tape un, c'est identique à l'adresse de x.
Si je tape b, elle est identique à l'adresse de y.
Alors, que dois-je voir si je dire, aller à l'adresse d'un?
Donc imprimer une étoile.
Donc étoiles signifie qu'il va, dans ce contexte.
Ampersand signifie ce qui est l'adresse de.
Donc jouer un moyen 1.
Et impression étoiles b me donne 2.
>> Et laissez-moi suppose, pour le moment, qu 'au moins le code qui
procède à l'exécution peut maintenant être motivée par de cette façon.
Mais nous nous pencherons sur cette idée avant longtemps.
Donc, cette version de Swap est maintenant correcte et permet
nous échangeons ce type de données particulier.
>> Donc toutes les questions lors Swap?
Sur étoiles?
Sur l'adresse de?
Et vous verrez, avec problème réglé 4, en quelque sorte,
mais le problème réglé 5, vraiment, comment ceux-ci les choses sont utiles et d'obtenir beaucoup plus
confortable avec eux, à la suite.
Rien du tout?
Bien.
Donc malloc est, encore une fois, cette fonction qui alloue seulement la mémoire, la mémoire
allocation.
Et pourquoi est-ce utile?
Eh bien, tout ce temps, vous avez utilisé malloc.
Si vous considérez maintenant comment GETSTRING œuvres, sans doute, il est
été de demander à quelqu'un pour un morceau de mémoire, quand les types d'utilisateurs d'une chaîne
en, car nous avons certainement ne savait pas, que le personnel CS50,
l'ampleur de ces chaînes que les humains vont taper pourrait être.
>> Donc, nous allons, pour la première fois, commencent à Peler le fonctionnement de la bibliothèque CS50,
à titre d'exemples quelques qui va nous y conduire.
Donc, si j'ouvre gedit et ouvrir scanf 0,
nous allons voir le code suivant.
Scanf 0, disponible sur le site Web de aujourd'hui, a relativement peu de lignes de code
ici, 14 à 20.
Et nous allons voir ce qu'il fait.
Il déclare un int, appelé x.
Il dit quelque chose comme, numéro s'il vous plaît.
Et maintenant, dit-il, scanf% i, et x.
Donc, il ya un tas de choses de nouveau.
>> Mais scanf, vous pouvez sorte de penser comme l'opposé de printf.
printf, bien sûr, des gravures à l'écran.
scanf sorte de balayages de l'utilisateur de clavier quelque chose qu'il ou elle a tapé.
>> % I est juste comme printf.
Cela signifie attendre la utilisateur de taper un int.
Et maintenant, pourquoi pensez-vous que je pourrait passer scanf & x?
Si le but dans la vie de scanf est d'obtenir quelque chose de l'utilisateur,
ce qui est le sens de l' passer, et x, maintenant?
Ouais?
>> PUBLIC: [inaudible].
DAVID J. Malan: Exactement.
Tout ce que je, l'humain, tape dans mon entrée va être enregistré à cet emplacement.
Il ne suffit pas, rappeler, à juste passer en x, parce que nous avons déjà vu,
chaque fois que vous passer juste une variable brute, comme un int, à une autre fonction,
Certes, il peut changer que variables, mais pas en permanence.
Il ne peut pas avoir un effet sur la Main.
Il ne peut changer sa propre copie locale.
Mais si, au contraire, vous n'avez pas me donner l'int réelle,
mais vous me donnez des instructions à que int, je maintenant, étant scanf,
sûrement, je peux suivre que aborder et de mettre un certain nombre, il
si vous avez accès à elle aussi.
>> Donc, quand je lance ce programme, nous allons voir.
Faire scanf 0 point barre, scanf 0.
Et si je tape maintenant un certain nombre comme 50, merci pour le 50.
Si maintenant je tape un nombre comme 1 négative, pour la négative 1.
Je tape maintenant un certain nombre comme 1,5, hm.
Pourquoi mon programme ne m'ignorer?
Eh bien, parce que tout simplement, j'ai dit il s'attendre qu'un int.
Bien.
C'est donc une version de cette.
Prenons les choses d'un cran et propose que ce n'est pas bon.
Et c'est là que réside un exemple très simple de la façon dont nous pouvons commencer à écrire du code
que d'autres personnes peuvent exploiter ou compromis par faire de mauvaises choses.
Donc, la ligne 16, si semblables dans l'esprit à avant,
mais je ne suis pas le déclarer int ce temps.
Je déclarant étoiles char, aka chaîne.
>> Mais qu'est-ce que cela signifie réellement?
Donc, si je ne spécifie pas un address-- et Je vous appelle arbitrairement, tampon,
mais je ne pouvais l'appeler S, et aux simple-- et puis je fais cela, expliquer à moi,
si vous pouviez, sur la base de la précédente logique, ce qui est scanf faire à la ligne 18,
si passe% s et un tampon, qui est une adresse?
Quel est scanf, si vous appliquez le exactement la même logique que la version 0,
vais essayer de faire ici, quand l'utilisateur tape quelque chose dans?
Ouais?
>> PUBLIC: [inaudible].
>> DAVID J. Malan: Exactement.
Scanf, par la logique plus tôt, va prendre la chaîne
que le typé humain in-- c'est désormais une chaîne,
ce n'est pas un nombre, sans doute, si il ou elle cooperates--
et il va essayer de mettre ce chaîne dans la mémoire à n'importe quel adresse
tampon précise.
Et ce qui est excellent, parce tampon est en effet destiné à être une adresse.
>> Mais je prétends ce programme est bogué dans un manière très grave, parce que ce que la valeur est
tampon par défaut?
Qu'ai-je initialisé en?
Qu'est-ce morceau de mémoire?
Je n'ai pas, non?
>> Ainsi, même si j'ai alloué une étoiles char qui n'est plus appelé s,
il est appelé à la place, de sorte buffer-- Traçons le nom de la variable
maintenant que buffer-- si je n'ai pas appelé getString ou malloc ici,
que signifie concrètement que tampon est juste une valeur d'ordures.
>> Maintenant, qu'est-ce que cela signifie?
Cela signifie que je l'ai dit scanf de s'attendre à une chaîne de l'utilisateur.
Et vous savez quoi?
Quelle que soit cette chose est orientée to-- et je dessine point d'interrogation,
mais en réalité, ça va être quelque chose comme Ox1, 2, 3, non?
C'est une valeur bidon qui vient se trouve être là depuis avant.
Donc, en d'autres termes, il est comme si la mémoire tampon est juste
en montrant quelque chose dans la mémoire.
Je n'ai aucune idée de ce que.
>> Donc, si je tape dans gabe maintenant, ça va pour essayer de mettre g-a-b-e / 0 il.
Mais qui sait ce que c'est?
Et, dans le passé, toute temps, nous avons essayé de toucher
mémoire qui ne lui appartient pas pour nous, ce qui s'est passé?
Ou presque à chaque fois.
Segmentation fault, non?
>> Cette flèche, je n'ai aucune idée où il est pointage. c'est juste une valeur aléatoire.
Et bien sûr, si vous interprétez une valeur aléatoire en tant qu'adresse,
vous allez aller à une destination aléatoire.
Donc gabe pourrait en effet accident mon programme dans ce cas ici.
>> Alors, que pouvons-nous faire, c'est presque aussi mauvais?
Considérez cette troisième et dernier exemple de scanf.
Cette version est mieux dans quel sens?
Si vous êtes à l'aise avec l' problème précédent, ce qui est mieux.
Pourquoi?
>> PUBLIC: [inaudible].
DAVID J. Malan: Bon.
Donc, ce cas de la ligne 16 est préférable, dans le sens
que nous sommes explicitement l'allocation de la mémoire.
Nous ne sommes pas en utilisant malloc, nous utilisons la semaine 2
approche de juste déclaration d'un tableau.
Et nous l'avons dit avant que la chaîne est tout simplement un tableau de caractères,
c'est donc tout à fait légitime.
Mais il est bien entendu que vous le notez, taille fixe, 16.
>> Alors ce programme est totalement sûr, si je tape
dans les chaînes de caractères un, deux caractères chaînes, 15 chaînes de caractères.
Mais dès que je commence à taper 16, 17, 18, 1000 chaînes de caractères,
où est cette chaîne va finir?
Il va finir par en partie ici.
Mais alors qui sait quoi d'autre est au-delà des frontières
de ce tableau particulier?
>> C'est comme si je n'ai déclaré 16 boîtes ici.
Ainsi, plutôt que de tirer sur les 16, nous allons juste prétends que j'ai dessiné 16.
Mais si j'essaie ensuite de lire une chaîne c'est beaucoup plus, comme 50 personnages,
Je vais commencer à mettre a, b, c, d, x, y, z.
Et ce n'est sans doute un autre segment de mémoire
que, encore une fois, peut causer mon programme de tomber en panne,
parce que je n'ai pas demandé rien de plus que seulement 16 octets.
>> Alors, qui s'en soucie?
Eh bien, voici la bibliothèque CS50.
Et la plupart de cela est juste comme instructions en haut.
La bibliothèque CS50, tout ce temps, a eu cette ligne dans la ligne 52.
Nous avons vu typedef, ou vous verrez typedef
dans pset 4, qui crée simplement un synonyme laquelle l'omble étoile peut être plus
simplement appelé chaîne.
C'est donc l'un des quelques roues de formation
nous avons utilisé secrètement sous le capot.
>> En attendant, voici la fonction, getchar.
Maintenant, apparemment, il n'y a pas de corps à elle.
Et en fait, si je continue à défilement, je n'ai pas fait
voir toutes les implémentations de ces fonctions.
Comme un test de cohérence, pourquoi est-ce?
>> PUBLIC: [inaudible].
DAVID J. Malan: Ouais.
Donc, c'est le fichier d'en-tête.
Et les fichiers d'en-tête contiennent des prototypes, ainsi que d'autres choses, il semble,
comme typedefs.
Mais dans CS50.c, que nous avons ne vous donné d'emblée,
mais a été dans l'appareil de CS50 tous cette fois, profondément à l'intérieur de ses dossiers,
remarquez qu'il ya un ensemble de tas de fonctions ici.
>> En fait, nous allons faire défiler vers le bas.
Ignorons plupart d'entre eux, pour l'instant.
Mais faites défiler jusqu'à getInt et voyez comment getInt fonctionne.
Voici donc getInt.
Et si vous jamais vraiment soucié comment obtenir int fonctionne, voici sa documentation.
Et parmi les choses qu'il dit, c'est qu'il vous dit
ce que les plages de valeurs, il peut revenir.
Il s'agit essentiellement négatif de 2 milliards à 2 milliards de positif, donner ou prendre.
>> Et il se trouve, tout cela temps, même si nous n'avons jamais
aviez-vous vérifier pour elle, si quelque chose va mal,
il s'avère que tous cette fois, a getInt
été un retour spécial constante, non nulle,
mais plutôt INT_MAX, qui est la convention de juste un programmeur.
Cela signifie ici est une valeur spéciale.
Assurez-vous de vérifier cela, il suffit de dans le cas où quelque chose va mal.
Mais nous n'avons jamais pris la peine avec qui à ce jour,
car encore une fois, ce est destiné à simplifier.
>> Mais comment se getInt mis en œuvre?
Eh bien, l'un, il ne prend aucun argument.
Nous le savons.
Elle renvoie un int.
Nous le savons.
Alors, comment ça marche sous le capot?
>> Donc, il ya apparemment une infinie boucle, au moins l'apparence d'un.
Notez que nous utilisons getString.
Donc, c'est intéressant. getInt appelle notre propre fonction, getString.
Et maintenant, que pourrait-il être le cas?
Pourquoi suis-je sur la défensive ici en ligne 165?
Qu'est-ce qui pourrait arriver dans la ligne 164, juste pour être clair?
C'est la même réponse que précédemment.
Pourrait bien être de mémoire.
Quelque chose se passe mal avec getString, nous devons être en mesure de gérer cela.
Et la raison pour laquelle je ne retournent pas nulle est que, techniquement, est un pointeur null.
getInt doit retourner un int.
Je n'ai donc arbitrairement décidé, en substance,
que 2 milliards, donner ou prendre, va être une valeur spéciale que je ne peux jamais
réellement obtenir de l'utilisateur.
C'est juste une valeur, je vais à perdre pour représenter un code d'erreur.
>> Alors maintenant, les choses deviennent un peu de fantaisie.
Et ce n'est pas tout à fait la même fonction comme avant, mais il est très similaire.
Donc remarque, je déclare ici, en ligne 172, à la fois un int n et un char c.
Et puis j'utilise cette ligne génial, sscanf, qui s'avère
n'analyse pas une chaîne à partir du clavier.
Il est une chaîne existante qui l'utilisateur a déjà tapé dans.
Donc je l'ai déjà appelé getString, qui signifie que je dois une chaîne en mémoire.
sscanf est ce que vous appeler une fonction d'analyse.
Il regarde la chaîne j'ai tapé, caractère par caractère,
et fait quelque chose d'utile.
Cette chaîne est stockée sur la ligne.
Et je sais que ce n'est qu'en allant sauvegarder ici et dire, oh, OK,
Je l'ai appelé pas de ce temps, mais la ligne.
>> Et maintenant, c'est un peu différent.
Mais cela signifie effectivement, pour des raisons nous allons un peu agitons nos mains à aujourd'hui,
que nous sommes arrivés à voir si l'utilisateur a tapé dans
et int et peut-être un autre personnage.
Si l'utilisateur a tapé dans un int, c'est va être stocké dans n, parce que je suis
passant par cette adresse, l' nouveau tour que nous avons vu aujourd'hui.
Si l'utilisateur a également tapé en 123x comme, que x
va finir par un lettre en caractère c.
>> Or, il s'avère que sscanf me dira, intelligemment,
nombre de variables a été SSCANF avec succès en mesure de combler.
Donc, par cette logique, si la fonction Je exécution est getInt,
mais je vérifie, éventuellement, pour l'utilisateur
avoir tapé dans un int suivi par quelque chose d'autre,
ce que je veux SSCANF de valeur de retour vraiment être?
Si le but est d'obtenir juste un int de l'utilisateur?
>> Donc, si SSCANF retours 2, qu'est-ce que cela signifie?
L'utilisateur a tapé dans quelque chose comme, littéralement,
123x, ce qui est tout simplement absurde.
C'est une condition d'erreur, et Je veux vérifier pour cela.
>> Donc, si l'utilisateur saisit en ce, par Dans cette logique, ce qui ne sscanf revenir,
diriez-vous?
Donc, il va revenir 2, parce la 123 va aller ici,
et x va finir ici.
Mais je ne veux pas le x se faire remplir.
Je veux SSCANF pour réussir dans seulement le remplissage de la première de ses variables.
Et c'est pour ça que je veulent-sscanf pour revenir 1.
>> Et si ce n'est un peu sur la tête pour le moment, c'est tout à fait bien.
Réaliser cependant, que l'un des valeurs de getInt et getString
c'est que nous faisons un diable de beaucoup de contrôle d'erreur comme celui-ci afin
que, à ce jour, vous pouvez très bien tout taper à votre clavier,
et nous allons l'attraper.
Et nous avons certainement, l' personnel, sera certainement pas
être à l'origine d'un bug dans votre programme, parce que nous sommes sur la défensive
la vérification de l'ensemble de la bête choses qu'un utilisateur peut faire,
comme taper une chaîne, quand vous vouliez vraiment int.
Donc, pour maintenant-- nous reviendrons revenir à cette avant long--
mais tout ce temps, getString et getInt ont
été sous le capot à l'aide de ce idée de base d'adresses de la mémoire.
>> Alors maintenant, nous allons faire les choses un peu plus convivial.
Comme vous le savez, de Binky dernier time-- si ma souris cooperate-- si
nous avons eu ce code, qui franchement, est assez absurde.
Ce code ne sert à rien utile, mais il était l'exemple
que le professeur Parlante utilisé pour représenter
ce qui se passait dans un programme impliquant la mémoire.
>> Donc, nous allons raconter ce histoire brièvement superbe.
Ces deux premières lignes, dans Anglais, faites ce que, diriez-vous?
Juste assez humain, mais légèrement termes techniques, prendre un coup de poignard.
PUBLIC: [inaudible].
>> DAVID J. Malan: OK, vous êtes l'établissement adresses pour votre variables x et y.
Pas tout à fait, parce que x et y ne sont pas variables dans le sens traditionnel du terme.
x et y sont des adresses ou va stocker adresse.
Essayons donc cette fois de plus.
Pas un mauvais départ, si.
Ouais?
>> PUBLIC: [inaudible].
DAVID J. Malan: Bon.
Je pense que c'est un peu plus propre.
Déclarer deux pointeurs, deux entiers.
Et nous les appelant x et y.
Ou si nous étions à tirer cette forme d'image, de plus,
rappeler tout simplement que tous les nous faisons avec cette première ligne
est dessinant un cadre comme celui-ci, avec une valeur d'ordures dedans,
et il appelle x, puis une autre boîte comme ça,
avec une valeur d'ordures en elle, l'appelant y.
Nous avons déclaré deux pointeurs que finalement
va stocker l'adresse d'un int.
Donc, c'est tout là-bas.
>> Alors, quand Binky a fait cela, la argile juste regardé comme ça.
Et Nick juste un peu enveloppé les flèches,
comme s'ils ne pointe pas partout en particulier, parce qu'ils sont tout simplement
des valeurs parasites.
Ils ne sont pas explicitement initialisées n'importe où en particulier.
>> Maintenant, la prochaine ligne de code, rappel, était-ce.
Donc, en assez convivial, mais l'anglais un peu technique,
quelle est cette ligne de code fait?
Ouais?
>> PUBLIC: [inaudible].
>> DAVID J. Malan: Parfait.
Il est l'allocation de la partie de la mémoire qui est de la taille d'un int.
Et c'est la moitié de la réponse.
Vous avez répondu à la droite la moitié de l'expression.
Qu'est-ce qui se passe sur le côté gauche du signe égal?
Ouais?
PUBLIC: Et ayants droit à la variable x?
>> DAVID J. Malan: Et ayants droit à la variable x.
Donc, pour résumer, alloue partie droite suffisamment de mémoire pour stocker un int.
Mais malloc spécifiquement renvoie l'adresse
de ce morceau de mémoire, ce qui vous avez juste proposé est stockée dans x.
>> Donc, ce que Nick fait la dernière fois avec Binky est il a traîné ce pointeur sur, l'argile,
pour pointer désormais à un morceau blanc de mémoire qui est égale à la taille d'un int.
Et en effet, qui est destiné pour représenter quatre octets.
>> Maintenant, la prochaine ligne de code fait cela, star du x obtient 42.
Ainsi, 42 est simple sur le droite, sens de la vie.
Côté gauche, star du x signifie quoi?
Cela aussi pourrait avoir gone-- c'est OK.
Dáccord.
>> PUBLIC: Fondamentalement, aller à la [inaudible]
DAVID J. Malan: Bon.
PUBLIC: [inaudible].
DAVID J. Malan: Exactement.
Côté des moyens de gauche aller à x.
x est l'adresse.
C'est comme 33 Oxford Street, ou Ox1.
Et star du x signifie aller à cette aborder et mettre ce là?
42.
>> Donc, en effet, c'est exactement ce que Nick a fait.
Il a commencé par par, essentiellement, mentalement
en pointant du doigt x, suivant la flèche
à la case blanche sur la droite côté, et de mettre le numéro 42 là-bas.
Mais les choses se sont un peu dangereux, non?
Binky est sur le point de perdre la tête.
>> Étoiles y est égal à 13, la malchance, signifie quoi?
Alors moyens y vont étoiles à l'adresse en y.
Mais quelle est l'adresse en y?
Très bien, c'est la valeur des ordures, non?
Je l'ai dessiné comme un point d'interrogation.
Nick a attiré comme une flèche recroquevillé.
Et dès que vous essayez de faire étoiles y, dit d'y aller,
mais il n'y a pas légitime adresse, c'est un emplacement faux,
le programme va planter.
Et la tête de Binky va s'envoler ici, comme il l'a fait.
>> Donc à la fin, ce programme était tout simplement défaut à plat.
Il s'agissait d'un programme bogué.
Et il avait besoin pour être fixé.
Et la seule façon, vraiment, de le fixer serait, par exemple, de cette ligne,
que nous n'avons même pas, parce que le programme s'est écrasé trop tôt.
Mais si nous devions résoudre ce problème, ce qui effet ne faire y égales x ont?
Eh bien, il fait essentiellement à y quelle que soit la valeur x est pointé.
>> Ainsi, dans l'histoire de Nick, ou l'histoire de Binky, à la fois
x et y ont été dirigés l'un vers le morceau de blanc de la mémoire,
de sorte que, finalement, quand vous ne étoiles y est égal à 13 fois,
vous finissez par mettre 13 dans l'emplacement approprié.
Donc, toutes ces lignes sont parfaitement légitime, sauf pour celui-ci,
quand c'est arrivé avant effectivement y voir assigner une valeur.
>> Maintenant, heureusement, vous n'avez pas faut raisonner par tous
de ces sortes de questions sur votre propre.
Permettez-moi d'aller de l'avant et ouvrir une fenêtre de terminal ici
et d'ouvrir, pour un instant, un super court programme qui
est également sorte de vaine.
C'est moche.
Il ne réalise pas quelque chose d'utile.
Mais il ne démontre questions de la mémoire, nous allons donc jeter un coup d'oeil.
>> Main, super simple.
Il appelle apparemment une fonction, f, puis revient à 0.
C'est un peu difficile de gâchis cette place.
Alors principal est assez bon, à ce jour.
>> Alors f est problématique.
Et n'a pas mis beaucoup effort en nommant
ici, à garder le focus sur le code.
f possède deux lignes.
Et nous allons voir ce qui se passe actuellement.
Donc, d'une part ici-- et permettez-moi de
ce compatible avec la précédente exemple-- d'une part,
la partie gauche est faire ce que, en anglais?
Il is--
PUBLIC: Création d'un pointeur.
DAVID J. Malan: Création d'un pointeur un int et appelant x.
Donc, il s'agit de créer une de ces boîtes Je continue à dessiner sur l'écran tactile.
Et maintenant, sur la droite côté, malloc, bien sûr,
est l'attribution d'un bloc de mémoire.
Et juste pour être clair, comment la quantité de mémoire est-il apparemment
l'attribution, si vous venez de sorte de faire le calcul ici?
>> C'est donc 40 octets.
Et je sais que seulement parce que je connais un int, sur l'appareil de CS50, au moins,
est quatre octets.
Donc 10 fois 4 est 40.
Donc stocke un x, l'adresse de la première des 40 ints que
ont été alloués espace arrière, vers l'arrière, vers l'arrière, vers l'arrière.
>> Et c'est ce qui est essentiel sur malloc.
Il ne prend pas un peu de mémoire ici, un peu ici, un peu là.
Il vous donne un morceau de la mémoire, de manière contiguë, à partir de la commande
système.
>> Maintenant, ce que à ce sujet, x support 10 est égal à 0?
Ligne arbitraire de code.
Il ne réalise pas quelque chose d'utile.
Mais il est intéressant, car x support 10--?
Ouais?
>> PUBLIC: [inaudible]?
>> DAVID J. Malan: x support 10 ne doit pas être nulle.
Le détail de nulle n'entre en jeu avec des chaînes, à la fin d'une chaîne.
Mais une bonne pensée.
>> Quelle est la taille de ce tableau, même si j'ai alloué 40 octets?
C'est 0 à neuf, non?
C'est 10 ints, totale.
40 octets, mais 10 ints, indexé de 0 à 0.
>> Alors, quelle est que x support 10?
Il s'agit en fait d'une certaine valeur inconnue de déchets.
C'est une mémoire qui ne m'appartient pas.
Je ne devrais pas être en contact avec ce que numéro 41, 42, 43, 44 octets.
Je vais un peu trop loin.
>> Et en effet, si je lance ce programme, il pourrait très bien tomber en panne.
Mais parfois, nous aurons la chance.
Et juste pour montrer this-- et franchement,
vous ne savez jamais avant ne it-- lançons ce.
Il n'a pas fait planter.
>> Mais si je change ce, pour exemple, d'être comme 1000,
de faire ce vraiment délibérée, voyons
si nous pouvons l'obtenir à planter cette fois.
OK, il ne s'est pas écrasé.
Comment environ 100.000?
Disons le refaire, et maintenant relancez-le.
Dáccord.
Ouf.
Bien.
Donc, apparemment, encore une fois, ceux-ci segments de mémoire, pour ainsi dire,
sont assez grande, afin que nous puissions avoir de la chance, encore et encore.
Mais finalement, une fois que vous obtenez ridicule et vraiment aller loin sur l'écran,
vous touchez la mémoire que vraiment, vraiment ne vous appartient pas.
>> Mais franchement, ces sortes d'insectes vont
être plus difficile et plus difficile de comprendre par vous-même.
Mais heureusement, comme les programmeurs, nous avons outils qui nous permettent de faire cela pour nous.
Donc, c'est peut-être un des programmes les plus laids,
encore plus laid que la sortie de gdb.
Mais il a toujours une ligne ou deux qui sont super utile.
>> Valgrind est un programme qui aide vous pas déboguer un programme, en soi,
mais trouver lié à la mémoire problèmes, notamment.
Il s'exécutera automatiquement votre code pour vous et regardez pendant au moins deux choses.
Un, avez-vous quelque chose de accidentelle comme la mémoire tactile
qui n'appartenaient pas à vous?
Il vous aidera à trouver les cas.
>> Et de deux, il aidera vous trouvez quelque chose qui s'appelle
des fuites de mémoire, que nous avons complètement ignoré, naïvement,
pendant un certain temps et avec bonheur.
Mais il s'avère, tout cette fois, à chaque fois
vous avez appelé dans getString tant de nos programmes,
vous demandez l'exploitation système pour la mémoire,
mais vous vous souvenez de ne jamais lui donner
dos, Non alloué faire, ou libre, comme on l'appelle.
Non, parce que nous n'avons jamais vous a demandé de le faire.
>> Mais tout ce temps, les programmes vous avez écrit en C
ont été fuite mémoire, demander à l'exploitation
système de plus en plus mémoire pour les chaînes et autres joyeusetés,
mais jamais le remettre.
Et maintenant, c'est un peu d'une simplification,
mais si vous avez déjà exécuté votre Mac ou votre PC depuis un certain temps, l'ouverture
beaucoup de programmes, peut-être la fermeture des programmes,
et même si votre ordinateur n'a pas planté,
il se fait de façon beaucoup plus lente, comme si il est vraiment
en utilisant beaucoup de mémoire ou ressources, même si,
si vous n'êtes pas encore toucher le clavier,
qui pourrait être-- mais pas always-- pourrait être que les programmes que vous utilisez
ont eux-mêmes des fuites de mémoire.
Et ils continuent à demander l'OS pour de plus en plus de mémoire, mais l'oublier,
pas vraiment l'utiliser, mais donc en prenant la mémoire loin
d'autres programmes qui pourraient vouloir lui.
Voilà donc une explication commune.
Maintenant, voici où Valgrind de sortie est complètement
atroce pour ceux qui sont moins et plus à l'aise aussi bien.
Mais l'intérêt truc est juste ici.
Il me dit une écriture invalide taille quatre qui se passe dans ce programme,
en particulier, à la ligne 21 de memory.c.
>> Si je vais à la ligne 21, hm, il fait est une écriture invalide de taille quatre.
Pourquoi la taille de quatre?
Eh bien, ce number-- et il pourrait être anything-- est un int.
C'est donc quatre octets.
Donc, je suis en train de quatre octets où ils n'appartiennent pas.
C'est ce que Valgrind est en fait de me dire.
En outre, il sera également dites-moi, comme nous le verrons,
que vous exécutez ce dans un futur ensemble de processeurs, si et quand vous avez une fuite mémoire, ce qui en fait
J'ai, parce que je l'ai appelé malloc, mais je n'ai pas fait
appelé, dans ce cas, libre, que nous finirons par voir
est à l'opposé de malloc.
>> Alors maintenant, je pense, un dernier exemple.
Alors celui-ci est un peu plus mystérieux, mais c'est peut-être
la principale raison pour être prudent avec la mémoire,
et la raison pour laquelle de nombreux programmes et / ou des serveurs Web, même à ce jour,
sont pris en charge par les méchants quelque part sur l'Internet qui sont en quelque sorte
l'envoi de paquets de faux à votre serveur essayer de compromettre vos comptes,
ou de prendre vos données, ou tout simplement généralement prendre sur une machine.
Débordement de tampon, comme le nom l'indique, des moyens
débordant pas un int, mais un tampon.
Et un tampon est juste une façon élégante de dire que c'est un tas de mémoire.
>> Et en effet, j'ai appelé une chaîne avant tampon, à la place de l'art.
Parce que si c'est un tampon, comme dans le sens YouTube,
ou chaque fois que vous regardez une vidéo, vous pourriez avoir vu le mot en mémoire tampon,
point, point, point.
C'est incroyablement ennuyeux.
Et cela signifie simplement que votre lecteur vidéo
essaie de télécharger beaucoup d'octets, beaucoup de bytes
à partir d'une vidéo à partir d'Internet.
Mais il est lent, il essaie pour télécharger un tas d'entre eux
à remplir un tampon, un récipient, de sorte que vous avez assez d'octets qu'il peut alors
vous montrer la vidéo, sans s'arrêter constamment.
Mais il s'avère, vous pouvez avoir un tampon à cette grande.
Mais essayer de mettre autant de données dans , et de très mauvaises choses peuvent arriver.
Ainsi, par exemple, regardons ce teaser finale d'un exemple.
Ceci est un autre programme qui, à première vue,
ne rien faire super utile.
Il a une fonction principale qui appelle cette fonction, f.
Et cette fonction, f, ici, a un tableau de caractères, appelée c, de la taille 12.
Et puis c'est en utilisant ce nouvelle fonction appelée strncpy.
>> Il s'avère que, avec ce simple, simple ligne de code, seulement deux lignes,
nous avons fait tout mon programme, et par conséquent, l'ensemble de mon ordinateur,
et mon compte d'utilisateur et mon disque conduire potentiellement vulnérables à toute personne
qui sait et est assez bon pour exécuter ce programme avec une certaine ligne de commande
argument.
En d'autres termes, si ce méchant met à l'intérieur de argvargv [1] en tapant
au clavier une très spécialement conçu chaîne, pas abc, 123, mais essentiellement,
symboles binaires qui représentent exécutable code, un programme qu'il a écrit,
avec ce programme simple, qui est représentant des milliers de programmes
qui sont tout aussi vulnérables, disons-le, il ou elle peut finalement supprimer tous
les fichiers sur mon disque dur, obtenir un clignoter rapidement, afin qu'il ou elle peut
taper des commandes sur leur propre, e-mail tous les fichiers à moi-même.
Tout ce que je peux faire, il ou elle peut faire avec ce code.
>> Nous n'allons pas tout à fait résoudre ce moment.
Et en fait, il va impliquer une petite image
comme ça, que nous allons bientôt à comprendre d'autant mieux.
Mais pour aujourd'hui, finissons sur ce qui est, espérons-le, un peu plus
compréhensible blague XKCD, jusqu'à ce que nous reprenions la prochaine fois.
Bien.
Rendez-vous mercredi.
>> [MUSIQUE LECTURE]
>> ENCEINTE: Et maintenant, profonde pensées, par Daven Farnham.
La mémoire est comme sauter dans un tas de feuilles d'or sur un dimanche après-midi.
Le vent souffle, lancer votre hair-- oh, je m'ennuie de l'époque when--
>> [Rires]