2010-04-08 29 views
5

Pregunta rápida c: ¿Cómo saber la longitud de un char * foo []?¿Cómo obtener la longitud de char **?

Gracias.

+4

es nul terminado –

+2

'char ** foo' no es lo mismo que' char * foo [] 'http://stackoverflow.com/questions/2448204/why-does-this-generate-a-segmentation-fault/2448255 # 2448255 –

+0

La pregunta no tiene sentido sin contexto. 'char * foo []' puede significar cosas completamente diferentes en diferentes contextos. – AnT

Respuesta

11

No puede. No sin saber algo sobre lo que está dentro de los indicadores, o almacenar esos datos antes de tiempo.

+3

+1, aunque me pregunto cuántas reencarnaciones de esta misma pregunta se responderán sin señalar numerosos duplicados. –

6

¿Quiere decir el número de cadenas en la matriz?

Si la matriz se asignó en la pila en el mismo bloque, puede usar el truco sizeof(foo)/sizeof(foo[0]).

const char *foo[] = { "abc", "def" }; 
const size_t length = sizeof(foo)/sizeof(foo[0]); 

Si estamos hablando acerca de la argv pasado al principal, se puede ver en el parámetro argc.

Si la matriz se asignó en el montón o pasó a una función (donde se desintegraría en un puntero), no tendrá suerte a menos que el que la asignó le pase el tamaño también.

2

Si la matriz está asignada estáticamente puede usar la función sizeof(). Entonces sizeof(foo)/sizeof(char *) funcionaría. Si la matriz se hizo dinámicamente, ¡estás en problemas! La longitud de dicha matriz normalmente se almacenaría explícitamente.

EDITAR: janks es por supuesto correcto, sizeof es un operador.

También vale la pena señalar que C99 permite sizeof en matrices de tamaño variable. Sin embargo, diferentes compiladores implementan diferentes partes de C99, por lo que se requiere cierta precaución.

+0

sizeof es un operador, no una función. Usar sizeof en una expresión (a diferencia del nombre de un tipo) ni siquiera requiere llaves. – janks

Cuestiones relacionadas