[C con Clase] Punteros y Arrays

Steven Davidson srd4121 en njit.edu
Mie Mar 18 07:11:11 CET 2009


Hola Abel,

Abel wrote:
> Hola,
> podría por favor alguien indicarme en que estoy fallando en el
> siguiente código:
> 	char temp1[3][3];
> 	char (*temp2)[3];
> 	char **temp3;
> 	
> 	strcpy(temp1[0],"A");
> 	strcpy(temp2,"B");

'temp2' es un array de 3 punteros. Deberías acceder a uno de estos 
punteros, como puede ser 'temp2[0]'. Sin embargo, en este esto 
provocaría un error en tiempo de ejecución, ya que un puntero no puede 
guardar información, sino tan sólo la dirección de memoria la cual sí 
contiene información o al menos existe. Tienes dos soluciones:
1. Adjudica memoria dinámicamente para el puntero, o
2. Haz que el puntero apunte (valga la redundancia) a memoria ya creada; 
por ejemplo, a otra cadena.

Por ejemplo,

temp2[0] = (char *)malloc( 10 );
strcpy( temp2[0], "B" );
...
free( temp2[0] );

No te olvides de liberar la memoria previamente creada.

> 	strcpy(temp3[0],"C");
> 	

Aquí, correctamente accedes a la cadena, por lo que los tipos 
concuerdan, pero caes en el mismo error que en el anterior. Debes crear 
memoria dinámicamente. En este caso, debes crear memoria para un puntero 
y luego acceder a cada elemento - cada puntero - y crear memoria para 
cada uno. Por ejemplo,

temp3 = (char **)malloc( 5*sizeof(char*) );  // Creamos 5 punteros

temp3[0] = (char *)malloc( 8 );  // Creamos una cadena de 8 caracteres
strcpy( temp3[0], "C" );

No te olvides de liberar la memoria de cada puntero y después la del 
primer array.

> 	scanf("%c",temp1[0]);
> 	scanf("%c",temp2);
> 	scanf("%c",temp3);

Aquí, tienes un problema de tipos. Estas llamadas deberían ser:

scanf( "%c", temp1[0] );  // o también: &temp1[0][0]
scanf( "%c", &temp2[0][0] );
scanf( "%c", &temp3[0][0] );

Por cierto, estas sentencias indican que quieres guardar un solo 
carácter. No sé si realmente quieres hacer esto, o si querías guardar 
varios caracteres en una cadena. Si esto es así, entonces deberías usar 
el especificador %s. Esto sería,

scanf( "%s", temp1[0] );
scanf( "%s", temp2[0] );
scanf( "%s", temp3[0] );


Espero que esto te aclare las dudas.

Steven





Más información sobre la lista de distribución Cconclase