nul terminando una matriz int

gcc 4.4.4 c89

Estaba experimentando con una matriz int. Y algo me vino a la mente. ¿Puedo terminarlo? Por ejemplo, estoy usando un 0 para terminar nulo. Sin embargo, 0 podría ser un valor válido en esta matriz.

El siguiente código terminará después del 5. Aunque quiero decir que 0 es un número válido. Sin embargo, podría especificar el tamaño de la matriz. Pero en este caso, no quiero hacerlo porque estoy interesado en este problema en particular.

Muchas gracias por cualquier consejo,

#include  static void test(int *p); int main(void) { int arr[] = {30, 450, 14, 5, 0, 10, '\0'}; test(arr); return 0; } static void test(int *p) { while(*p) { printf("Array values [ %d ]\n", *p++); } } 

En resumen, no. Técnicamente, los caracteres nulos son igualmente válidos en las cadenas, es solo una convención que los usamos para marcar el final de una cadena, y todas las funciones de la biblioteca estándar esperan eso. Hay cadenas “terminadas en nulo doble” que terminan en \0\0 para los casos en que una cadena debe contener un \0 , pero, por supuesto, tiene el problema de no poder almacenar \0\0 en la cadena.

Si no desea almacenar el tamaño de una matriz por separado (o usar trucos como sizeof ), necesita crear un centinela que pueda almacenarse en ese tipo, pero sabe que no será parte de la matriz; puede usar 45 siempre y cuando esté seguro de que arr no tendrá ese valor válido, solo necesita ser único

Para utilizar un valor centinela, obviamente tiene que encontrar un valor que no sea de otra manera datos válidos. Ese es uno de los inconvenientes de usar un centinela (el otro es la búsqueda lineal requerida para encontrar la longitud). ¿Cómo funciona algo como 0xFFFF para ti?

Si esto fuera C ++, sugeriría hacer una clase con un miembro de longitud asociado (o mejor aún, simplemente usando std::vector ). Para C, probablemente deberías mantener la variable de longitud separada tú mismo. Usted puede obtener fantasía y ponerlo y la matriz juntos en una estructura si lo desea.

En pocas palabras, \ 0 es lo mismo que 0, así que si tiene un cero en su matriz, su código confundirá eso con el final de la matriz:

 int arr[] = {30, 450, 14, 5, 0, 10, '\0'}; ^ this is the end of the array 

Edición: tenga en cuenta que al “final de la matriz” me refiero al final conceptual de la matriz según lo define su algoritmo, en lugar de las extensiones reales de los datos establecidos en la memoria por el lenguaje de progtwigción C.

Bueno, también puede cambiar su centinela de \0 a \\0 . Y, en consecuencia, una ligera modificación en la condición del bucle while le ayudará a solucionar su problema.

 while(*p != '\\0') 

Ahora, 0 no se tratará como terminador para la matriz de enteros y se imprimirá toda la matriz.