2017-02-06 3 views
0

Ich habe gerade angefangen zu lernen C nachdem ich bereits ein paar Jahre Erfahrung in Python, C# und Java hatte. Ich habe in einem Tutorial gelernt, dass char anything[] immer ein Zeiger ist. (Heute hat mir jemand gesagt, das ist falsch) - Ich denke meine Frage hat etwas damit zu tun. Trotzdem versuche ich die Länge eines char-Array zu erhalten:chararray Größe und Länge sind nicht gleich

#include <stdio.h> 

int get_string_length(char * string) 
{ 
    int length = 0; 
    while(string[length] != '\0') 
    { 
     char c = string[length]; 
     length++; 
    } 
    return length; 
} 

int get_string_size(char * string) 
{ 
    return sizeof(string); 
} 

int main() 
{ 
    printf("%d\n", get_string_size("hello world")); // returns 8 
    printf("%d\n", get_string_length("hello world")); // returns 11 
    printf("%d\n", sizeof("hello world")); // returns 12 -> Okay, because of '\0'-char 
    return 0; 
} 

Ergebnis:

so , warum ist meine get_string_size -Methode, die 8 anstatt o zurückgibt f 12? (Da beide nur Anruf sizeof())

+2

'get_string_size (char *)' gibt 8 zurück, da das die Größe in Bytes eines Zeigers auf Ihrem Computer ist, Sie können 'strlen (char *)' verwenden, um das erwartete Ergebnis zu erhalten. – George

+0

So viele Antworten in dieser kurzen Zeit - und auch ein Duplikat ... Ich glaube ich bin wirklich am Anfangspunkt von C ...: D Danke für alle Antworten ... Ich denke ich muss noch ein bisschen mehr lesen –

Antwort

5

char anything[] ist ein Zeiger? Nicht ganz.

Der tatsächliche Typ des Literal"hello world" ist ein const char[12]. (Beachten Sie das zusätzliche Element für den NUL-Terminator).

Aber wenn er an eine Funktion übergeben wird, zerfällt dieser Typ zu einem const char*.

get_string_size So kehrt die sizeof(const char*) 8 auf der Plattform ist (dh die sizeof a char*), aber sizeof("hello world")sizeof(const char[12]) ist, die 12 ist, da sizeof (char) durch den C-Standard definiert ist 1.

get_string_length zu sein, ist das zurückkehr Position des ersten NUL-Terminators beginnend mit dem Zeiger, der an diesen übergeben wurde.

Schließlich ist zu beachten, dass Sie %zu als Formatangabe für den sizeof Rückgabetyp verwenden sollten: technisch das Verhalten von printf("%d\n", sizeof("hello world")); ist undefined.

+0

'printf ("% zu \ n ", sizeof (" test "));' druckt 'zu' tatsächlich mit meinem Code ... –

1

Dies macht nicht das, was Sie denken:

int get_string_size(char * string) 
{ 
    return sizeof(string); 
} 

Hier sizeof(string) ist die Größe des Zeigers, die (64-Bit vermutlich) Plattform immer 8 auf Ihrer ist. Auf einer 32-Bit-Plattform wäre es höchstwahrscheinlich 4 statt 8.

Auf der anderen Seite sizeof("hello world") ist die Speichergröße von der Zeichenfolge Literal "hello world" genommen, die 11 + 1 (+1 für den NUL-Terminator) ist.

2

Verwenden Sie immer strlen(), um die Länge einer Zeichenfolge zu bestimmen.

Verwendung sizeof() für Stringlänge ist gefährlich und sollte vermieden werden. sizeof() gibt die Größe des angegebenen Typs zurück, und in diesem Fall ist der angegebene Typ ein Zeiger (Ihr System muss 64-Bit sein, da die Größe 8 ist).

Betrachten Sie diesen Code und seine Ausgabe:

char string[] = "This is a test"; 
char *pointer = string; 

printf("sizeof string: %zu\n", sizeof(string)); 
printf("sizeof pointer: %zu\n", sizeof(pointer)); 
printf("strlen pointer: %zu\n", strlen(pointer)); 

sizeof string: 15 
sizeof pointer: 8 
strlen pointer: 14 
+0

yeah Ich weiß über 'strlen()' - es ist nur zum Lernen :) –

+1

@MatthiasBurger verstanden. Verwenden Sie sizeof() nur beim Bestimmen der Länge eines Zeichenarrays (nicht Zeiger). Siehe mein Beispiel oben. –

+0

das druckt tatsächlich 3 mal "zu" als Werte: D Problem mit meinem Compiler ?? –

Verwandte Themen