2010-09-03 14 views

Antwort

6

Nein, mit einem C-Zeiger können Sie seine Länge nicht in einer plattformunabhängigen Art bestimmen.

Für eine tatsächliche C-Array obwohl sehen dirkgently ist answer

+0

Die Frage ist nicht sehr klar; Sie können die Array-Länge immer erhalten, wenn ihre Definition lokal ist ;-) – dirkgently

+0

@dirkently, stimme ich zu, es ist unklar, ob sie nach einer Zeigerlänge oder Array-Länge fragen. Ich leitete sie zu Ihrer Antwort für das letztere um – JaredPar

3

Sie es bekommen konnte mit einem Makro:

#define sizeofa(array) sizeof array/sizeof array[ 0 ] 

, wenn und nur wenn das Array automatisch und Sie Zugriff auf sie im Rahmen ihrer Definition wie:

#include <stdio.h> 
int main() { 
    int x[] = { 1, 2, 3 }; 
    printf("%zd\n", sizeofa(x)); 
    return 0; 
} 

jedoch haben, wenn Sie nur eine (verfallenen) Zeiger Sie die Array-Länge, ohne auf einige nicht-portable Implementierung bekommen spezifischer Hack.

+0

"% z" ?? Was meinen Sie? – user411313

+3

* z * _Gibt an, dass ein folgender d-, ​​i-, o-, u-, x- oder X-Konvertierungsbezeichner für ein 'size_t' oder das entsprechende vorzeichenbehaftete ganzzahlige Argument gilt; oder dass ein folgender n-Konvertierungsbezeichner für einen Zeiger auf einen signed Integer-Typ gilt, der dem Argument size_t entspricht._ – dirkgently

+2

Dieses Makro benötigt viel mehr Klammern, um häufige Makroprobleme zu vermeiden. –

1

Wenn Sie MSVC/MinGW verwenden gibt es eine nonportable Lösung für einen echten C-Zeiger:

#include <malloc.h> 
char *s=malloc(1234); 
#ifdef __int64 
printf("%lu\n", _msize(s)); 
#else 
#endif 

Für einen echten C-Array wie

AnyType myarray[] = {...}; 

oder

AnyType myarray[constVal]; 

siehe die andere Antwort.

+1

Sie können nicht davon ausgehen, dass Sie einen Zeiger von malloc haben. – fazo

+1

@fazo, du kannst sicher davon ausgehen, dass es von malloc kommt. Es ist nur eine schreckliche Idee :) – JaredPar

Verwandte Themen