2010-09-03 29 views

Respuesta

6

No, dado un puntero C, no puede determinar su longitud de una manera independiente de la plataforma.

Para una matriz real C, aunque ver la answer

+0

La pregunta no es muy clara; Siempre puede obtener la longitud de la matriz si su definición es de alcance local ;-) – dirkgently

+0

@dirkgently, estoy de acuerdo, no está claro si están pidiendo una longitud de puntero o longitud de matriz. Los redirigí a tu respuesta para el último – JaredPar

3

usted podría conseguir utilizando una macro dirkgently:

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

si y sólo si la matriz es automático y se accede a él en el alcance de su definición como:

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

sin embargo, si sólo tiene un (cariado) que puntero no puede obtener la longitud de la matriz sin recurrir a alguna aplicación no portátil hack específico.

+0

"% z" ?? ¿Qué quieres decir? – user411313

+3

* z * _Especifica que el siguiente especificador de conversión d, i, o, u, x o X se aplica a un 'size_t' o al correspondiente argumento de tipo entero con signo; o que un especificador de conversión n siguiente se aplica a un puntero a un tipo de entero con signo correspondiente al argumento size_t._ – dirkgently

+2

Esa macro necesita muchos más paréntesis para evitar problemas de macro comunes. –

1

Si utiliza MSVC/MinGW no es una solución no portátil para un verdadero C-puntero:

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

Para un verdadero C-Array como

AnyType myarray[] = {...}; 

o

AnyType myarray[constVal]; 

vea la otra respuesta.

+1

no puede suponer, que tiene un puntero de malloc. – fazo

+1

@fazo, ciertamente puedes asumir que es de malloc. Es solo una idea terrible :) – JaredPar

Cuestiones relacionadas