Declarare...

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
costi
Junior
Junior
Posts: 8
Joined: 04 Mar 2011, 15:26
Judet: Bacău

Declarare...

Post by costi » 04 Mar 2011, 15:30

Salut.
La declararea unui sir de caractere in C++ [indiferent de domeniu de vizibilitate]vor fi toate elementele din vector initializate la valoarea "NULL"?
Dar pointerii , cu adresa 0 ? :|



Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: Declarare...

Post by Dragos Cojocari » 04 Mar 2011, 16:07

Nu si nu. Compilatorul de C/C++ nu face nici un fel de intitializari, asta e treaba programatorului. Nu stiu daca asta s-a schimbat in C++0x dar nu cred.

costi
Junior
Junior
Posts: 8
Joined: 04 Mar 2011, 15:26
Judet: Bacău

Re: Declarare...

Post by costi » 05 Mar 2011, 00:14

am inteles, mersi

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Declarare...

Post by Marius Bancila » 07 Mar 2011, 13:21

Atentie, unele medii de dezvolare fac niste initializari. De exemplu in VC++ daca folosesti configuratia pentru debug, vei vedea ca variabilele veinitializare explicit au valoarea 0xCC in fiecare byte. De asemenea memorie alocata cu new/malloc este scrisa cu 0xCD. Daca rulezi insa cu configuratia de Release, aceste initializari nu mai sunt valabile, vei vedea 0 peste tot. Totusi standarul de C++ nu impune nici un fel de restrictii in privinta asta. Nu stiu nici eu daca C++0x schimba ceva in acest sens, dar nu cred.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Mugurel Nechita
Junior
Junior
Posts: 2
Joined: 10 Aug 2008, 22:29
Judet: Argeş
Location: Pitesti
Contact:

Re: Declarare...

Post by Mugurel Nechita » 07 Mar 2011, 21:47

Initializarea unui sir de caractere (cu valaorea nula (0)) se poate realiza printr-o constructie de forma:

Code: Select all

char s[20]={'\0'}; // sau char s[20]={};
TCHAR ss[20]={_T('\0')};
Similar pentru un sir de intregi:

Code: Select all

int n[20]={0}; // sau int n[20]={};
Problema apare in momentul in care doresti sa initializezi sirul cu alta valoare, deoarece o constructie de forma:

Code: Select all

int n[10]={-1};
va initializa sirul cu valoarea -1 la pozitia 0, iar in celelalte cu 0 (n:-1,0,0,0,0,0,0,0,0,0).

Cele de mai sus sunt valabile atat in BC++, cat si in VC++.

PS. Nu am avut prilejul sa lucrez cu GCC, dar se pare ca acest compilator permite initializari de forma:

Code: Select all

int n[10] = {[0 ... 9] = -1};

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Declarare...

Post by Silviu Ardelean » 08 Mar 2011, 00:23

Marius Bancila wrote:Atentie, unele medii de dezvolare fac niste initializari. De exemplu in VC++ daca folosesti configuratia pentru debug, vei vedea ca variabilele veinitializare explicit au valoarea 0xCC in fiecare byte.
Asta se intampla datorita setarii de Basic Runtime Checks (Project settings -> C++ -> Code Generation) cu valoarea /GZ sau /RTC (in functie de versiunea VS).
Daca setarea asta e pusa pe "default", array-ul se va initializa cu valori random.
initialize_var_array.png
initialize_var_array.png (5.3 KiB) Viewed 2938 times

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Declarare...

Post by Ovidiu Cucu » 08 Mar 2011, 12:19

De la sfinitii parinti Kernighan si Ritchie cetire:
External and static variables are initialized to
zero by default. Automatic variables for which is no explicit initializer have undefined (i.e.,
garbage) values.
Sa luam aminteeeee!... :biggrin:

In standardul de C:
6.7.8 Initialization
If an object that has automatic storage duration is not initialized explicitly, its value is
indeterminate. If an object that has static storage duration is not initialized explicitly,
then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules;
— if it is a union, the first named member is initialized (recursively) according to these rules.
Astea fiind zise, hai sa tragem un ochi in standardul de C++ (am scris AICI de unde se poate face rost).
Nu am gasit nimic sa contrazica Cele de Sus, nici la anexa C (Compatibility), nici macar in C++0x.
Deci, pana la proba contrarie, sunt valable si in C++.

Totusi, exista un "totusi".
E bine totusi ca un programator sa-si faca un bun obicei din a initializa variablele la declarare, indiferent de situatie.
Nu-l doare mana daca scrie ceva gen:

Code: Select all

static int i = 0;
...chiar daca teoretic, nu e necesar.

Post Reply