No tiene sentido usar puntero triple. Lo que te importa es la dirección de memoria que contendrá
pArreglo y cambiarlo en otra función. Como sabes un argumento de una función es una copia de un dato y para modificar el valor de una variable se pasa el puntero a esa variable (así el puntero es la copia y lo que hay dentro se modifica), por eso se pasa un puntero a puntero.
Como
crearArreglo va a crear un array dinámico que debe ser devuelto (a a introducir en
pArreglo un valor), esta función debe recibir la dirección de
pArreglo (que es copia, pero su dato sí se puede modificar).
Ídem para
asignarMemoria. No debe ser un puntero triple porque es realmente la encargada de crear el array e introducir esa dirección de memoria en
pArreglo. La dirección de
pArreglo ya la has pasado en el argumento
punteroApuntero de
crearArreglo y es lo que te interesa, así que se lo das sin más.
Totalmente diferente es el trabajo en
copiarValores. Allí sólo te interesa rellenar el array, no debes modificar su dirección de memoria y por tanto debes pasarle la dirección del propio array. Vas a modificar su contenido.
Sería algo así:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void crearArreglo(int **punteroApuntero, int dim);
void asignarMemoria(int **punteroApuntero, int dim );
void copiarValores(int *puntero, int dim);
int main()
{
int *pArreglo = NULL;
int dim = 0; //dimension
printf("\nIngrese la dimension del arreglo: ");
srand(time(NULL
)); //para obtener valores random en copiarValores() crearArreglo(&pArreglo,dim); //se le pasa el puntero a puntero y la dimension
printf("\nPrimer elemento desde main: %d\n",*pArreglo
);
free(pArreglo
); // recuerda que siempre que adquieres memorias a mano debes liberarla a mano.
return 0;
}// fin main
void crearArreglo(int **punteroApuntero, int dim)
{
asignarMemoria(punteroApuntero, dim);
copiarValores(*punteroApuntero, dim);
}// fin funcion crearArreglo
void asignarMemoria(int **punteroApuntero, int dim)
{
(*punteroApuntero
) = (int *) malloc ( dim
* sizeof(int) );
if( (*punteroApuntero) == NULL )
{
printf("\nError en asignacion de memoria.\n"); }//fin if
else
{
printf("\nAsignacion de memoria exitosa.\n");
} // fin else
} // fin funcion asignarMemoria
void copiarValores(int *puntero, int dim)
{
for(int i=0; i<dim; ++i)
{
puntero
[i
] = rand() % 10; printf("Elemento %d : %d\n",i
,puntero
[i
]); }// te lo cambio por un for. Es más conciso en este caso
} // fin funcion copiarValores