Lo que pasa es que tienes un puntero normal que es int *cadena y lo estas intentando pasar a una función "genera_cad(&cadena)" que espera un puntero doble, pero que en su cuerpo lo tratas como puntero normal. En definición estas haciendo una confusión.
Si quieres pasar un puntero a una funcion haz que la funcion espere un puntero de igual tipo. un ejemplo es:
int main(){
int *n
funcion(n);
}
void funcion(int *n){
}
Como ves no hace falta poner el operador & delante porque n es un tipo de variable especial que guarda la dirección del primer elemento de la cadena. A efectos n es lo mismo que &n[0] y por eso no necesitas poner & delante, ya que seria como hacer algo parecido a &&int[0] lo que esta fatal y carece de sentido.
Si necesitas saber el tamaño de la cadena mejor le pasas a 'tamanho' desde main y así te evitas tener que tener otra función para eso.
Otro punto a destacar es que en el caso de los int no hay NULL al final del array por lo que debes saber siempre su tamaño con anterioridad. Solo las cadenas de caracteres tienen el carácter NULL que indica que la cadena termina en un determinado lugar y que no hemos utilizado todo el espacio reservado.
Si reservamos 1000 chars y solo ponemos "Hola mundo" le sobraría 990 espacios de los cuales printf los imprimiría todos sin saber donde parar, incluso seguiría imprimiendo hasta después de que terminara los mil caracteres ya que nunca va a saber hasta donde debe imprimir.
Entonces en el caso de las cadenas de caracteres si reservo 1000 espacios y lo leo con la función que sea(scanf, gets...), esa función se va encargar de poner el null ahí justo al fin de lo que escribimos, si escribimos "Hola mundo" ten por seguro que en memoria esta "Hola mundo\0" ese \0 indica que ahí esta el fin de la cadena que introducimos y que no utilizamos los 1000 espacios reservados, como podemos imprimir como string con un printf ("%s", cadena); que es lo mismo que decir "imprime desde el primer carácter hasta encontrar el nulo \0" y no hasta el infinito y más allá. XD
Si te das cuanta que no puedes imprimir enteros como chars ya sabrás por que no existe ese NULL en los arreglos de enteros, porque eres tú quien se encarga de mostrarlos uno a uno con un bucle ya que no se puede imprimir como cadena.
Me tome la libertad de arreglar un poco su código haciéndolo algo más funcional.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int* genera_cad (int tam);
int main() {
srand ( time ( NULL
) ); // llame la funcion srand una sola vez al inicio de main int *cadena = genera_cad ( tam );
printf ( "\n la long de la cadena es %d\n", tam
);
return 0;
}
int* genera_cad (int tam) {
int *cadena;
cadena
= ( int * ) malloc ( sizeof ( int ) * tam
); int i;
for ( i = 0; i < tam; i++ ) {
* ( cadena
+ i
) = rand() % 2; }
return cadena;
}