1 00:00:00,000 --> 00:00:00,410 2 00:00:00,410 --> 00:00:03,130 >> DAVID J. MALAN: Così si scopre che la copia di una stringa non è così 3 00:00:03,130 --> 00:00:05,750 semplice come la copia di un primitivo, come un int o float. 4 00:00:05,750 --> 00:00:09,190 Dopo tutto, sotto la cappa una stringa è una sequenza di caratteri. 5 00:00:09,190 --> 00:00:13,130 Quindi copia di una stringa, quindi, deve coinvolgere la copia di tutta quella sequenza di 6 00:00:13,130 --> 00:00:14,240 caratteri. 7 00:00:14,240 --> 00:00:17,470 >> Torniamo nostra attenzione a quella ultima implementazione e strappare questo 8 00:00:17,470 --> 00:00:21,470 linea, stringa t è uguale s, che evidentemente non era sufficiente. 9 00:00:21,470 --> 00:00:24,440 Diciamo sostituirla con una linea che sembra, invece, come questo. 10 00:00:24,440 --> 00:00:34,020 String t ottiene malloc della lunghezza della stringa di S Plus 1 volte la dimensione di un carattere. 11 00:00:34,020 --> 00:00:36,320 >> Ora c'è citazione un po 'andare in questa linea di codice. 12 00:00:36,320 --> 00:00:39,330 In primo luogo, malloc, abbreviazione di memoria allocazione, e la 13 00:00:39,330 --> 00:00:40,700 funzione fa proprio questo. 14 00:00:40,700 --> 00:00:44,740 Dato un numero intero, restituisce a voi l' indirizzo di un pezzo di memoria di 15 00:00:44,740 --> 00:00:45,960 tale numero di byte. 16 00:00:45,960 --> 00:00:50,090 Nel frattempo, la lunghezza della stringa di s più 1 si intende per indicare che vogliamo come 17 00:00:50,090 --> 00:00:54,690 numero di byte come s occupa già, compreso il suo terminatore nullo, il 18 00:00:54,690 --> 00:00:57,050 0 backslash alla fine di una stringa. 19 00:00:57,050 --> 00:01:00,170 >> Nel frattempo, non necessariamente ricordo quanto è grande un char è, anche 20 00:01:00,170 --> 00:01:04,340 anche se sulla maggior parte dei sistemi è semplicemente 1 byte, quindi chiamerò dimensione del carattere per 21 00:01:04,340 --> 00:01:08,210 capire quanto è grande dinamicamente un carattere individuale è. 22 00:01:08,210 --> 00:01:12,550 Una volta moltiplicati insieme, torno il numero totale di byte che ho bisogno. 23 00:01:12,550 --> 00:01:14,680 >> Ma cosa succede se malloc non riesce a restituire la memoria di cui abbiamo bisogno? 24 00:01:14,680 --> 00:01:16,730 Mi piacerebbe migliore per verificare che quanto segue. 25 00:01:16,730 --> 00:01:23,330 Se t è uguale a zero, allora sto andando prima a s libero, la memoria restituita da get 26 00:01:23,330 --> 00:01:27,120 stringa, e poi ho intenzione di ritorno 1, a significare errore. 27 00:01:27,120 --> 00:01:30,360 >> Ma se tutto va bene, ho intenzione di continuare utilizzare un quattro loop e iterare 28 00:01:30,360 --> 00:01:31,110 come segue. 29 00:01:31,110 --> 00:01:36,000 Per int ottengo 0, n equals la lunghezza della stringa di s. 30 00:01:36,000 --> 00:01:40,350 Io vado a fare questo fino a quando i è minore o uguale a n in modo che 31 00:01:40,350 --> 00:01:44,460 scorrere attraverso, compresa la carattere di terminazione null in s. 32 00:01:44,460 --> 00:01:47,450 >> E su ogni iterazione, sono andando a incrementare i. 33 00:01:47,450 --> 00:01:52,496 Nel frattempo, all'interno di questo ciclo, copiare s di i-esimo carattere in di t-esimo 34 00:01:52,496 --> 00:01:59,310 posizione, è sufficiente fare t Staffa mi viene s staffa i. 41 00:01:59,320 --> 00:02:02,750 >> Vediamo ora Salvare, compilare e eseguire questo nuovo programma. 42 00:02:02,750 --> 00:02:06,690 Fai copia 1 dot barra copia 1. 43 00:02:06,690 --> 00:02:09,460 E io dico qualcosa di simile ciao a tutti minuscolo. 44 00:02:09,460 --> 00:02:12,280 E per fortuna, questa volta la mia originale rimane invariato. 45 00:02:12,280 --> 00:02:13,660 ciao a tutti minuscolo. 46 00:02:13,660 --> 00:02:15,540 Ma la copia è, infatti, in maiuscolo. 47 00:02:37,120 --> 00:02:38,963