目次
- 1 1. Introducción
- 2 2. Conceptos básicos de arrays
- 3 3. Declaración e inicialización de arrays
- 4 4. Cómo obtener la longitud del array (número de elementos)
- 5 5. Obtención de la longitud de arreglos de cadenas
- 6 6. Manejo de arrays de longitud variable (VLA)
- 7 7. Consideraciones sobre la longitud de los arreglos
- 8 8. Resumen
- 9 Preguntas frecuentes (FAQ)
- 10 Q1: ¿Por qué al usar sizeof para obtener la longitud del array no funciona correctamente dentro de la función?
- 11 Q2: Al obtener la longitud de una cadena, ¿cuál debo usar, sizeof o strlen?
- 12 Q3: ¿Debería usar arreglos de longitud variable (VLA) o asignación dinámica de memoria (malloc)?
- 13 Q4: ¿Qué sucede si olvido liberar la memoria después de usar un arreglo asignado dinámicamente?
- 14 Q5: ¿Cuáles son los puntos a tener en cuenta para prevenir el desbordamiento de búfer?
- 15 Resumen
1. Introducción
El lenguaje de programación «C» se utiliza en una amplia gama de campos, como el desarrollo de sistemas y los sistemas embebidos, debido a su simplicidad y alto rendimiento. En particular, el «array» es una estructura de datos importante para gestionar datos de manera agrupada y se utiliza con frecuencia en muchos programas. En este artículo, explicamos en detalle cómo obtener la longitud de un array en el lenguaje C. Nos centramos especialmente en los puntos donde los principiantes suelen tener dificultades, explicando desde lo básico hasta lo avanzado de manera detallada, para que adquieras sólidamente las habilidades necesarias para comprender con precisión la longitud del array.2. Conceptos básicos de arrays
¿Qué es un array?
Un array es una estructura de datos que permite agrupar y gestionar valores del mismo tipo de datos en una sola unidad. Es conveniente para procesar múltiples datos de manera conjunta y reserva memoria de forma contigua para datos del mismo tipo.Usos de los arrays
- Procesamiento masivo de datos – Es ideal para gestionar de forma agrupada datos del mismo tipo, como calificaciones de estudiantes o datos de sensores.
- Uso en procesamiento repetitivo – Dado que se puede acceder secuencialmente mediante bucles, se utiliza en escenarios donde se repite el mismo procesamiento de manera eficiente.
- Gestión de memoria – Como utiliza el espacio de memoria de forma contigua, la velocidad de acceso es rápida y eficiente.
Cómo funcionan los arrays
Los arrays permiten acceder a cada elemento mediante un índice (subíndice). En C, los índices comienzan desde 0 y el último elemento se accede con «tamaño del array – 1». Ejemplo:int numbers[5] = {10, 20, 30, 40, 50};
printf("%dn", numbers[0]); // Se imprime 10
printf("%dn", numbers[4]); // Se imprime 50
En este ejemplo, el array numbers
almacena 5 enteros y se puede acceder a cada elemento mediante el subíndice.3. Declaración e inicialización de arrays
Método de declaración de arrays
En C, los arrays se declaran de la siguiente manera.nombre_de_tipo nombre_array[tamaño];
Ejemplo concreto:int scores[10]; // array de tipo entero con 10 elementos
En este ejemplo, se declara un array de tipo entero (int) scores
y se reserva espacio en memoria para 10 elementos.Inicialización de arrays
Es posible inicializar los arrays al mismo tiempo que se declaran.- Ejemplo de inicialización explícita
int values[5] = {1, 2, 3, 4, 5};
- Ejemplo de inicialización de solo algunos elementos
int data[5] = {10, 20}; // los elementos restantes se inicializan a 0
- Ejemplo de inicialización omitiendo el tamaño
int numbers[] = {10, 20, 30}; // el número de elementos se calcula automáticamente como 3
Precauciones con arrays no inicializados
Si se utiliza un array sin inicializar, puede contener valores impredecibles (datos basura). Por lo tanto, se recomienda inicializar según sea necesario.4. Cómo obtener la longitud del array (número de elementos)
En C, obtener la longitud del array (número de elementos) de manera precisa es importante. Especialmente, al realizar procesamiento de bucles o gestión de datos, es necesario conocer el tamaño del array. En esta sección, explicamos en detalle los métodos específicos para obtenerlo y los puntos de atención.4.1 sizeof
Método de obtención usando el operador
La forma más común de obtener la longitud del array es utilizar el operador sizeof
. sizeof
devuelve el tamaño en memoria de un tipo de datos o variable en bytes.Ejemplo de código básico#include
int main() {
int array[5] = {10, 20, 30, 40, 50};
int length = sizeof(array) / sizeof(array[0]); // Calcular el número de elementos del array
printf("Longitud del array: %d\n", length); // Salida: 5
return 0;
}
Puntos:sizeof(array)
– Obtiene el tamaño en bytes del array completo.sizeof(array[0])
– Obtiene el tamaño en bytes del primer elemento del array.- Al dividir el tamaño del array completo por el tamaño de un elemento, se calcula el número de elementos.
4.2 Precauciones al pasar un array a una función
Al pasar un array como argumento a una función, el array se convierte en un «puntero». Por lo tanto, el operadorsizeof
devuelve el tamaño del puntero (en la mayoría de los casos 4 u 8 bytes), y no se puede obtener la longitud del array de manera precisa.Ejemplo del problema#include
void printArrayLength(int arr[]) {
printf("Tamaño: %ld\n", sizeof(arr) / sizeof(arr[0])); // No funciona correctamente
}
int main() {
int array[5] = {1, 2, 3, 4, 5};
printArrayLength(array);
return 0;
}
Solución Pase la longitud como un argumento separado.Ejemplo de código corregido#include
void printArrayLength(int arr[], int length) {
printf("Longitud del array: %d\n", length);
}
int main() {
int array[5] = {1, 2, 3, 4, 5};
int length = sizeof(array) / sizeof(array[0]); // Calcular el número de elementos
printArrayLength(array, length);
return 0;
}

5. Obtención de la longitud de arreglos de cadenas
C, las cadenas también se tratan como arreglos. Sin embargo, a diferencia de los arreglos numéricos usuales, las cadenas son arreglos de tipo carácter (char
tipo), y se adjunta un carácter especial '\0'
(carácter nulo) al final. En esta sección, se explica cómo obtener la longitud de los arreglos de cadenas y los puntos de atención.5.1 Relación entre cadenas y arreglos
Las cadenas son arreglos de tipochar
que representan una colección de caracteres. Veamos el siguiente ejemplo.char str[] = "Hello";
En este código, el arreglo str
se almacena en memoria de la siguiente manera.H | e | l | l | o | ‘\0’ |
---|
\0
es el carácter de terminación y indica el final de la cadena.- El tamaño del arreglo se reserva como 6 bytes, incluyendo
\0
.
5.2 Obtención de la longitud de la cadena usando la función strlen
Para obtener la longitud de la cadena (número de caracteres), se utiliza la función strlen
de la biblioteca estándar.Ejemplo de código:#include
#include
int main() {
char str[] = "Hello";
printf("Longitud de la cadena: %ld\n", strlen(str)); // Salida: 5
return 0;
}
Puntos de atención:strlen
calcula dinámicamente la longitud de la cadena, por lo que no cuenta el carácter de terminación'\0'
.
5.3 Diferencia con el operador sizeof
Al obtener la longitud de la cadena, también es posible usar el operador sizeof
, pero los resultados difieren de strlen
.Ejemplo de código:#include
#include
int main() {
char str[] = "Hello";
printf("sizeof: %ld\n", sizeof(str)); // Salida: 6 (incluyendo carácter de terminación)
printf("strlen: %ld\n", strlen(str)); // Salida: 5 (excluyendo carácter de terminación)
return 0;
}
Puntos de diferencia:sizeof
devuelve el tamaño completo del arreglo (incluyendo el carácter de terminación).strlen
devuelve solo el número de caracteres (sin incluir el carácter de terminación).
6. Manejo de arrays de longitud variable (VLA)
En el lenguaje C, a partir de la norma C99, se introdujeron losarrays de longitud variable (VLA: Variable Length Array). Esta funcionalidad permitedeterminar el tamaño del array en tiempo de ejecución en lugar de en tiempo de compilación. Esta sección explica en detalle las características, el uso y los puntos de atención de los VLA.6.1 ¿Qué es un array de longitud variable (VLA)?
Los arrays normales sonarrays estáticos con tamaño fijo en tiempo de compilación. Por otro lado, el VLA es unarray dinámico donde el tamaño se puede determinar en tiempo de ejecución, y permite configurar el tamaño de manera flexible basado en la entrada del usuario o resultados de cálculos.Ejemplo de array estático convencional:int arr[10]; // El tamaño se fija en tiempo de compilación
Ejemplo de array de longitud variable (VLA):int size;
scanf("%d", &size); // Determinar el tamaño en tiempo de ejecución
int arr[size]; // Array asignado en tiempo de ejecución
6.2 Uso básico de VLA
En el siguiente ejemplo, se crea un array según el tamaño ingresado por el usuario y se procesa su contenido.Ejemplo de código:#include
int main() {
int n;
printf("Ingrese el tamaño del array: ");
scanf("%d", &n); // Determinar el tamaño en tiempo de ejecución
int arr[n]; // Declaración de VLA
// Entrada de datos al array
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
// Mostrar el contenido del array
printf("Elementos del array: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
Ejemplo de resultado de ejecución:Ingrese el tamaño del array: 5
Elementos del array: 1 2 3 4 5
Explicación de puntos clave:- Como se puede especificar dinámicamente el tamaño del array en tiempo de ejecución, es posible una gestión de datos flexible.
- Una característica es que el tamaño del array puede determinarse durante la ejecución, incluso si no se conoce al inicio del programa.

7. Consideraciones sobre la longitud de los arreglos
C, al manejar arreglos, la gestión del tamaño (longitud) es extremadamente importante. En particular, si se comete un error en la longitud del arreglo, no solo afectará negativamente el funcionamiento del programa, sino que también puede llevar a graves riesgos de seguridad. En esta sección, explicamos los puntos de atención sobre la longitud de los arreglos y los puntos para codificar de manera segura.7.1 Prevenir el acceso fuera de los límites del arreglo
Dado que los arreglos son estructuras de datos de tamaño fijo, acceder más allá del rango especificado puede causar comportamientos inesperados o el colapso del programa.Ejemplo: Acceso fuera de límites#include
int main() {
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i <= 5; i++) { // The last loop condition is incorrect
printf("%dn", arr[i]); // Out-of-bounds access
}
return 0;
}
Medidas:- Configuración adecuada de la condición del bucle
for (int i = 0; i < 5; i++) { // Correct condition
printf("%dn", arr[i]);
}
- Utilizar dinámicamente el tamaño del arreglo
int length = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < length; i++) {
printf("%dn", arr[i]);
}
7.2 El peligro del desbordamiento de búfer
Un problema típico causado por errores en la gestión del tamaño del arreglo es eldesbordamiento de búfer. Esto ocurre cuando se escriben datos fuera del rango del arreglo, sobrescribiendo otras áreas de memoria.Ejemplo: Desbordamiento de búfer#include
#include
int main() {
char buffer[10]; // Array of 10 bytes
strcpy(buffer, "This string is too long!"); // Size overflow
printf("%sn", buffer);
return 0;
}
Medidas:- Utilizar funciones seguras
strncpy(buffer, "This string is too long!", sizeof(buffer) - 1);
buffer[sizeof(buffer) - 1] = '\0'; // Ensure null terminator
8. Resumen
En este artículo, hemos explicado en detalle desde los conceptos básicos hasta las aplicaciones relacionadas con la «longitud de los arrays» en el lenguaje C. Los arrays son una estructura de datos muy conveniente, pero si no se manejan correctamente, pueden llevar a mal funcionamiento del programa o riesgos de seguridad, por lo que es necesario tener precaución. Aquí, repasaremos los puntos clave del artículo mientras resumimos consejos útiles para la práctica futura.8.1 Repaso del artículo
- Conceptos básicos de arrays y declaración e inicialización
- Los arrays son una estructura de datos que almacena elementos del mismo tipo de datos de manera continua, y es necesario especificar el tamaño al declararlos.
- Durante la inicialización, también es posible omitir el tamaño, lo que permite un uso conveniente.
- Métodos para obtener la longitud de los arrays (número de elementos)
- En arrays estáticos, se puede obtener la longitud usando el operador
sizeof
. - Al pasar arrays a funciones, era necesario pasar la longitud como un argumento separado.
- Métodos para obtener la longitud de arrays de cadenas
- En cadenas, se obtiene el número de caracteres usando la función
strlen
, y es importante entender la diferencia consizeof
. - En arrays bidimensionales, era necesario manejar cada cadena individualmente.
- Manejo de arrays de longitud variable (VLA)
- Los VLA, que permiten determinar el tamaño en tiempo de ejecución, ofrecen alta flexibilidad, pero era necesario prestar atención a desbordamientos de pila y compatibilidad con compiladores.
- En algunos casos, también se consideraba el uso de
malloc
para la asignación dinámica de memoria.
- Precauciones sobre la longitud de los arrays y codificación segura
- Para prevenir accesos fuera de límites o desbordamientos de búfer, es necesario utilizar verificaciones de tamaño y funciones seguras.
- Al usar memoria dinámica, es importante realizar la asignación y liberación en conjunto.
8.2 Pasos futuros
- Ejecutar ejemplos de código para profundizar la comprensión
- Compile y ejecute realmente el código del artículo para confirmar los resultados.
- Desafiarse con ejercicios avanzados
- Cree programas utilizando arrays multidimensionales o punteros para profundizar aún más la comprensión.
- Continuar practicando codificación segura
- Haga un hábito diseñar programas considerando la seguridad y el manejo de errores.
8.3 Finalmente
Los arrays son una estructura de datos básica en el lenguaje C, pero con un amplio rango de aplicaciones. Utilice el contenido explicado en este artículo para aspirar a una programación segura y eficiente.Preguntas frecuentes (FAQ)
Q1: ¿Por qué al usar sizeof
para obtener la longitud del array no funciona correctamente dentro de la función?
A: El operador sizeof
devuelve el tamaño completo del array cuando está definido directamente dentro del ámbito. Sin embargo, cuando se pasa el array a una función, se convierte en un puntero. Como el puntero solo contiene la dirección inicial del array, usar sizeof
devuelve el tamaño del puntero (4 u 8 bytes), por lo que no se puede obtener el número correcto de elementos.Solución: Cuando se pase el array a la función, pase la longitud del array como un argumento separado.void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%dn", arr[i]);
}
}
int main() {
int array[5] = {1, 2, 3, 4, 5};
printArray(array, sizeof(array) / sizeof(array[0])); // pasar la longitud
return 0;
}
Q2: Al obtener la longitud de una cadena, ¿cuál debo usar, sizeof
o strlen
?
A: Es necesario diferenciar según el propósito.sizeof
: Obtiene el número de bytes del array completo. Incluye el carácter de terminación'\0'
, por lo que es adecuado para verificar el tamaño del buffer.strlen
: Obtiene el número real de caracteres (excluyendo el carácter de terminación'\0'
). Se usa cuando se quiere conocer la longitud de la cadena.
char str[] = "Hello";
printf("%ldn", sizeof(str)); // Salida: 6 (incluyendo '\0')
printf("%ldn", strlen(str)); // Salida: 5
Q3: ¿Debería usar arreglos de longitud variable (VLA) o asignación dinámica de memoria (malloc
)?
A: La elección depende del uso.- Características de VLA:
- Es conveniente porque el tamaño se puede determinar en tiempo de ejecución.
- Utiliza memoria de pila, por lo que hay riesgo de desbordamiento de pila con tamaños grandes.
- Desde C11, hay entornos que no lo soportan, por lo que es necesario prestar atención a la compatibilidad.
- Características de
malloc
: - Utiliza memoria de heap, por lo que puede manejar datos a gran escala.
- Es necesario gestionar la memoria (asignación y liberación) adecuadamente, pero ofrece alta portabilidad y mayor seguridad.
Q4: ¿Qué sucede si olvido liberar la memoria después de usar un arreglo asignado dinámicamente?
A:Si olvida liberar la memoria asignada dinámicamente, se producirá un fuga de memoria. Si las fugas de memoria se acumulan, puede llevar a una disminución en el rendimiento del sistema o a un crash.Medidas:Cuando use memoria dinámica, asegúrese de liberarla con la funciónfree()
después de usarla.Ejemplo:int *arr = malloc(10 * sizeof(int)); // Asignación de memoria
if (arr == NULL) {
printf("Fallo en la asignación de memoria\n");
return 1;
}
// Liberación después del uso
free(arr);
Q5: ¿Cuáles son los puntos a tener en cuenta para prevenir el desbordamiento de búfer?
A:El desbordamiento de búfer ocurre al escribir datos que exceden el tamaño del arreglo, lo que causa fallos en el programa o vulnerabilidades de seguridad. Mantengamos en mente los siguientes puntos.- Realizar la verificación del tamaño del arreglo
- Limitar el tamaño al ingresar datos.
- Usar funciones seguras
strcpy
en lugar destrncpy
,sprintf
en lugar desnprintf
, etc., usar funciones con restricciones de tamaño.
- Asegurar un tamaño de arreglo con margen
- Considerar el tamaño de los datos de entrada más el carácter de terminación.
- Realizar verificaciones y pruebas exhaustivas
- Realizar pruebas de valores límite e inspeccionar casos extremos.