Samo iskam da poiasnia neshto. Preporuchvaniiat sintaksis
char* string = new char[7]
ne e C sintaksis! Tova e C++ sintaksis i po printsip, ako
triabva da se pridurzhame kum C++ traditsiiata, sled tova
vmesto printf/scanf i t.n. triabva da se izpolzva cout/cin.
No
sega da otgovoria na purvonachalniia vupros. Tova e chesto
sreshtana greshka pri nachinaeshtite, kogato rabotiat sus
stringove. Problemut e, che komandata
char *string;
naistina suzdava ukazatel kum string, koeto shte reche
initsializira se promenliva, koiato sudurzha adres v
pametta ot sorta na 432864 (suvsem proizvolno go kazvam,
adresite v pametta izlgezhdat malko po-razlichno i se
zadavat v shestnadestichen vid, no v sluchaia tova niama
znachenie), prosto si predstaviai, che kum kletka nomer
432864 sochi string. Adresa mozhesh da poluchish s
printf("%f", string);
Tova mozhe i da e 000000! Absolyutno proizvolno e. I
nai-vazhnoto, na tova miasto v pametta mozhe i da ima,
mozhe i da niama vazhni danni, koito mogat da izpolzvat i
vurhu koito mozhe da se zapisva. Sega, kakva e tsakata:
triabva da prisvoish na promenlivata string stoinost, koiato
otgovaria na niakoi adres v pametta, za koito e spetsialno
ukazano, che triabva da bude rezerviran za tvoiata tsel. I
po-tochno, ako triabva nizut da e po-dulug, to i
"posledvashtite go" adresi shte budat rezervirani. Tova se
pravi, kakto beshe spomenato veche v C++ s operatora new,
a v C se pravi s funtsiiata malloc ot bibliotekata <stdlib.h>.
S kod:
#include <stdlib.h>
int main() {
char* my_string = malloc (255 * sizeof(char));
strcpy(my_string, "blabla");
printf(my_string);
free(my_string);
return 0;
}
Zabelezhi, che my_string = "blabla" bi bilo greshno, t.k. tova
bi prisvoilo na samiia ukazatel stoinost blabla, a
*my_string = "blabla" bi dalo preduprezhdeniia pri
kompilatsiia i mozhe da ima nepredvideni rezultati, t.k.
po-sushtestvo e glupost (?).
Ima samo edna kniga za C, i Kernighan i Ritchie sa neinite
prorotsi: "The C Programming Language". I zabelezhi niakoi
neshta. Edna programa na C chesto raboti, vupreki che ne e
korektno napisana, tui kato kompilatorut nalaga mnogo malko
otgrachniia i togava se hvashtash za glavata, kogato sled dva-tri
chasa idva segfault. V toia sluchai mozhe da pomogne purify
(tsena ot roda na $ 5000) i demalloc (vzh. google) ili kakto
kazva Linuks Torvalds, namirash s gdb kude dropi i posle
gledash mnogo vnimatelno i mislish...
Pozdravi,
KeiN
|