2012-04-13 7 views
2

ich den folgenden CodeStrlen von char * malloc

char *new_str; 
int size_in_bytes; 
int length; 

size_in_bytes = 2*sizeof(char); 
new_str = (char *)malloc(size_in_bytes); 
length = strlen(new_str); 

Erwartung der Länge sein 2, es tatsächlich ist 16. Kann jemand erklären, warum? Haben

+1

Dieser Code liest über den zugewiesenen Speicher hinaus und kann zu undefiniertem Verhalten führen –

+0

Verwenden Sie 'calloc()', dann erhalten Sie die richtige Antwort (die 0 sein sollte). Es gibt keine (tragbare) Möglichkeit, die Größe eines zugewiesenen Blocks zu bestimmen (es sei denn, es gibt etwas Neues im neuesten Standard). – TMN

Antwort

5

strlen() gibt den Index des ersten Nullbytes ('\ 0') zurück, beginnend mit der Adresse, an der Sie übergeben werden. Zeichenfolgen in C enden normalerweise immer mit diesem Zeichen, um das Ende der Zeichenfolge zu markieren.

strlen() gibt nicht die Länge des aktuellen Speicherblocks zurück.

In Ihrem Beispiel ist der Speicher nicht initialisiert und strlen() liest über das Ende Ihres Speicherblocks und in andere Teile des Heapspeichers Ihres Programms, bis ein Nullbyte gefunden wird.