[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