Anomalía de conteo de longitud de la matriz

El conteo está regresando resultados impredecibles. A veces tienen razón. A veces totalmente extraño. ¿Alguien me puede decir qué está mal?

#include  int len(int[]); int main (int argc, const char * argv[]) { int a[]={1,2,3,4,5,6,7,8}; int* i = a; printf("length is %d",(len(i))); return 0; } int len(int* a){ int count = 0; for (; *a!='\0'; a++) { count++; } return count; } 

Creo que estás confundido entre las cadenas en C (matrices de char ) y otras matrices. Es una convención que las cadenas C terminen con un carácter nulo ( '\0' ), pero no todas las matrices (incluso las matrices de caracteres) se terminan de esta manera.

La convención general es almacenar la longitud de una matriz en algún lugar o usar un valor centinela al final de la matriz. Este valor debe ser uno que no aparezca dentro de la matriz, por ejemplo, '\0' en cadenas, o -1 en una matriz de entradas positivas.

Además, si sabe que a es una matriz int (y no un puntero a una matriz int), puede usar:

 size_t length = sizeof(a) / sizeof(a[0]); 

Para que pudieras hacer:

 int a[] = {1,2,3,4,5,6,7,8}; size_t length = sizeof(a) / sizeof(a[0]); // In this case, sizeof(a[0]) // is the same as sizeof(int), because it's an int array. 

Pero no puedes hacer:

 int *a = malloc(sizeof(int) * 10); size_t length = sizeof(a) / sizeof(a[0]); // WRONG! 

El último ejemplo se comstackrá, pero la respuesta será incorrecta, porque está obteniendo el tamaño de un puntero a la matriz en lugar del tamaño de la matriz.

Tenga en cuenta que tampoco puede usar este tamaño para leer el tamaño de una matriz que se ha pasado a una función. No importa si declara su función len(int *a) o len(int a[]) : a será un puntero, porque el comstackdor convierte las matrices en argumentos de función para ser un puntero a su primer elemento.

¡No habrá un cero al final de tu matriz a menos que pongas uno allí! Una matriz de caracteres literal definida con una cadena de caracteres tiene, de hecho, un valor de centinela de este tipo, pero es especial; Otras matrices no tienen equivalente.

La función len() que está intentando escribir no se puede escribir para matrices generales en C: no hay forma de determinar el tamaño de una matriz dinámica sin usar los elementos internos (no documentados, específicos de la plataforma) del asignador de memoria. Si era importante hacer esto para su aplicación, solo podría hacerlo si le fuera posible agregar un cero al final de cada matriz, explícitamente.

No puedes contar matrices de esa manera. Sólo las cadenas están terminadas en nulo. Si desea que funcione de manera confiable, deberá agregar un elemento adicional a su matriz que contenga ‘\ 0’. Pero asegúrese de recordar tener en cuenta que su longitud no será mayor que la verdadera debido a que ‘\ 0’

A diferencia de las cadenas, las matrices normales no terminan con un byte nulo 0x00. La razón por la que las cadenas usan esto es porque las matrices no tienen concepto de longitud; los arreglos son simplemente piezas de memoria contiguas, depende de usted hacer un seguimiento de la longitud de los arreglos.