Nachalo Vhod/Registratsiia Pomosht Originala na tazi stranica
Oblasti
 Novini
 Aktualna tema
 Linux portali
 Kakvo e Linuks?
 Vuprosi-otgovori
 Forumi
   •Trudova borsa
   •Konkurs
 Statii
 Distributsii
   •Poruchka na CD
 Made In BG
 Failove
 Vruzki
 Galeriia
 Konferentsii
Nastroiki
 Vunshen vid
 Predlozheniia
 Napravi si sam
I oshte ...
 Za nas
 Linuks za bulgari EOOD
 Link kum nas
 Predlozheniia

Podkrepiano ot:
TelePoint - Miasto za hora sus svobodni idei

SiteGround

initLab

Adsys Group

SAP Bulgaria

Vuprosi otgovori
Vupros: C programirane
[Tursi: ]

VNIMANIE: Izpolzvaite forumite na saita za da zadadete vashite vuprosi.

Kum nachaloto |Dobavi vupros |Otgovori
 
Vupros
Ot: :) Data: 04/07/2003
 abe ot skoro se zanimavam s C ta ima i mnogo neiasnotii i
neshta, koito si mislia che sym razbral no iavno ne e taka
Vyprosyt mi e za strigovete i tiahnoto inicializirane:

string[]="Hello"; i string[6]="Hello" sa mi iasni 
 no kogato probvam char *string; i posle niakyde v programata
 se opitam da mu zadam stoinost sys scanf("%s",string); mi
 dava greshki ...(Segmentation fault), neznam dali tova e
normalno.
 V tozi sluchai razglejdam *string kato pointer kym pyrviat
 symvol ot texta, koito shte byde zadaden s pomoshtta na
 scanf.(nali stringovete sa razglejdani kato masivi ot tip
char).
 Ta ako niakoi naistina e siguren v mnenieto si po vyprosa
 neka da kaje ... btw kompiliram s gcc 2.95 ili neshto takova
na Slackware8.1 s kernel 2.4.18

 PS. nikyde do sega ne sym sreshtal v knigi za zadavane ot
 vida *string i posle scanf .... no neznam ot kyde sym
 siguren che e taka ... za tova ako ne e taka kakto si misla
PLS da me razobedite :)



Otgovor #1
Ot: Mihail Petrov (misho1960__at__yahoo __tochka__ com) Data: 04/07/2003
 Kogato imash ukazatel kum promenliva ot tip char, neshtata   
triabva da se napraviat taka:   
char *string = new char[7];   
sprintf(string, "%s\0", "Hello");   
   
pri tova polozhenie niama da ti dade segmentation  fault, a  
se zadava goleminata mu s edin simvol poveche zaradi  
zatvariashtata nula. A tova koeto se opitvash ti da napravish e 
che v promenlivata string ima miasto za dva simvola, kolkoto 
e i dulzhinata na ukazatelia, i ne zabraviai sled kato 
svurshish rabotata si s promenlivata da ia osvobodish s delete 
string; 
  
Opitai i uspeh !  
  
Mihail Petrov


Otgovor #2
Ot: Sudo Data: 04/08/2003
Niakolko vazhni utochneniia:
1. sprintf funktsiite VINAGI slagat "\0" v izhodniia string.
2. Za takova neshto kato char *string = new char[7];
 se izpolzva malloc (calloc) ne e nuzhno s top muha da gurmim
:)
 3. Ako govorim za Linuks/x86 dulzhinata na ukazatelia e 4
baita v DOS 2 baita i t.n.

Aide sus zdrave :)



Otgovor #3
Ot: KeuH Data: 04/08/2003
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 


<< download manager za X (3 ) | X WIndows System on FreeBSD (2 ) >>

 
© 2011-... Asotsiatsiia "Linuks za bulgari"
© 2007-2010 Linuks za bulgari EOOD
© 1999-2006 Slavej Karadjov
Ako iskate da prepechatate ili tsitirate informatsiia ot tozi sait prochetete purvo tova
Vunshniia vid e napraven ot MOMCHE
Code Version: 1.0.8 H (Revision: 23-09-2011)
 
Изпълнението отне: 0 wallclock secs ( 0.07 usr + 0.02 sys = 0.09 CPU)