2012-01-04 19 views
86

Powiel możliwe:
Memory Allocation char* and char[]Jak zadeklarować ciągi w C

Czy ktoś może wyjaśnić mi, co jest różnica między tymi liniami kodu

char *p = "String"; 
char p2[] = "String"; 
char p3[7] = "String"; 

w jakim sprawa czy powinienem użyć każdego z powyższych?

+26

Dobrze, że ostatnia jest przepełnienie bufora, więc to miłe. – Dan

+3

Trzecim przykładem powinno być 'p3 [6]': musisz obliczyć ostateczny 0 – fge

+18

@ fge: w rzeczywistości 7. – Mat

Odpowiedz

34

This link powinien zaspokoić twoją ciekawość.

Zasadniczo (zapominając o trzecim przykładzie, który jest zły), różnica między 1 a 2 polega na tym, że 1 przydziela miejsce dla wskaźnika do tablicy.

Ale w kodzie można nimi manipulować jako wskaźniki - tyle, że nie można ponownie przydzielić drugiego.

20

Nie powinieneś używać trzeciego, ponieważ jest zły. "String" zajmuje 7 bajtów, a nie 5.

Pierwszym z nich jest wskaźnik (można przypisać do innego adresu), pozostałe dwa są zadeklarowane jako tablice i nie można ich przypisać do różnych lokalizacji pamięci (ale ich zawartość może się zmienić, aby tego uniknąć, użyj const).

+5

'char p3 [5] =" String ";' podczas gdy niebezpieczne nie jest złe i jest poprawne w C (ale nie w C++) – ouah

+5

@ouah - jest źle. Może przekazać kompilację, ale mimo wszystko jest ** zła **. – littleadv

+4

jest to ściśle zgodna definicja obiektu. Program ściśle zgodny nie jest "zły" pod względem C. – ouah

7
char *p = "String"; means pointer to a string type variable. 

char p3[5] = "String"; oznacza, że ​​wstępnie definiujesz rozmiar tablicy składającej się z nie więcej niż 5 elementów. Zauważ, że dla ciągów null „\ 0” jest również uważany za element.So oświadczenie to dałoby błąd, ponieważ liczba elementów wynosi 7 tak powinno być:

char p3[7]= "String"; 
27

Ciągi w C są reprezentowane jako tablice znaków.

char *p = "String"; 

Jesteś deklarując wskaźnik, który wskazuje na ciąg przechowywane pewne gdzie w programie (modyfikując ten ciąg jest niezdefiniowane zachowanie) w zależności od języka programowania C 2 ed.

char p2[] = "String"; 

Jesteś deklarowania tablicę char zainicjowany z ciągiem „string” odchodzi do kompilatora zadanie policzyć rozmiar tablicy.

char p3[5] = "String"; 

Deklarujesz tablicę o rozmiarze 5 i zainicjalizujesz ją ciągiem "Łańcuch". Jest to błąd, ponieważ "String" nie pasuje do 5 elementów.

char p3[7] = "String"; to poprawna deklaracja ("\ 0" jest znakiem kończącym w łańcuchach c).

http://c-faq.com/~scs/cclass/notes/sx8.html

+0

Pamiętaj, że link został zaktualizowany do http://c-faq.com/charstring/index.html –

Powiązane problemy