• Sábado 14 de Diciembre de 2024, 19:04

Autor Tema:  Apuntadores a cadenas  (Leído 2177 veces)

AnimaSubtilis

  • Miembro MUY activo
  • ***
  • Mensajes: 172
  • Nacionalidad: co
    • Ver Perfil
Apuntadores a cadenas
« en: Martes 19 de Agosto de 2008, 20:32 »
0
Buenas a todos los del foro..

en este momento estoy haciendo un apuntador de tipo
char pal[5][20];
algo asi

Código: Text
  1. char *cad[5];
  2.  int i;
  3.  for(i=0;i<5;i++)
  4.   cad[i]=(char*)malloc(sizeof(char)*20);
  5.  for(i=0;i<3;i++)
  6.  {
  7.   cout<<"Digite palabra en posicion "<<i+1<<" ";  
  8.   cin>>cad[i];
  9.  }
  10.  system("CLS");
  11.  cout<<"Palabras->"<<endl;
  12.  for(i=0;i<3;i++)  
  13.   cout<<cad[i]<<endl;    
  14.  system("PAUSE");
  15.  

mi pregunta es la siguiente...

 :P hay alguna forma de relaccionar el malloc sin tenerlo que hacer uno a uno por el primer for

 :rolleyes: solo es para salir de dudas
pues lo intente de muchas maneras pero la unica forma de la cual me funciono fue esa

muchas gracias por la atencion prestada...
A menudo unas pocas horas de «prueba y ensayo» podrán ahorrarte minutos de leer manuales.
[size=150]
Dios nos Otorgo el uno y el cero....y con eso creamos un universo....[/size]

[size=109]↑°°°°ÄNÍMÄ §ÛBTÍLͧ°°°°↓[/size]


chuidiang

  • Miembro MUY activo
  • ***
  • Mensajes: 123
  • Nacionalidad: es
    • Ver Perfil
    • http://www.chuidiang.com
Re: Apuntadores a cadenas
« Respuesta #1 en: Miércoles 20 de Agosto de 2008, 10:12 »
0
Hola:

En principio esa es la forma correcta, debes hacer un malloc() por cada fila de la matriz. Sin embargo, puedes hacer una especie de "trampa". Consiste en hacer un array de 100 en tu caso y saber que las filas comienzan en fila*20 (es decir, posiciones 0, 20, 40, etc). La forma de acceder a fila,columna sería array[fila*20+columna]. Es una chapuza y salvo casos muy especiales no merece la pena hacerlo.

Se bueno.

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: Apuntadores a cadenas
« Respuesta #2 en: Miércoles 20 de Agosto de 2008, 10:48 »
0
Chuidiang, la solución de asignarlo en un bloque no es tan "chapuza" como te imaginas. Ciertamente no es la más didáctica ni la más correcta en cuanto a estilo (y posiblemente sea más lenta que el acceso con doble índice -todo dependerá de cómo trate el compilador a ese "fila*20" o incluso de qué valor sea el multiplicador-), pero a veces es la mejor.

¿Por qué? Pues para evitar la fragmentación del montículo local, y para forzar tener cada subarray de forma contigua (quizás porque luego nos interese pasarlo como un puntero a algún lado).

El tema más delicado sería el de la fragmentación del montículo. Imagina que empiezas a asignar y liberar memoria de forma indiscriminada sobre ese (y otros arrays). Y luego supón un programa con múltiples hilos asignando y liberando memoria sobre dicho montículo. Terminarías con un montículo bien fragmentado en el que la asignación de memoria sería cada vez más lenta e ineficiente... Y eso sin entrar en el tema del tamaño de página de Windows (o Linux), etc.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

chuidiang

  • Miembro MUY activo
  • ***
  • Mensajes: 123
  • Nacionalidad: es
    • Ver Perfil
    • http://www.chuidiang.com
Re: Apuntadores a cadenas
« Respuesta #3 en: Jueves 21 de Agosto de 2008, 09:50 »
0
Hola:

Por eso puse la puntilla final "salvo casos muy especiales",  :P

Se bueno.

AnimaSubtilis

  • Miembro MUY activo
  • ***
  • Mensajes: 172
  • Nacionalidad: co
    • Ver Perfil
Re: Apuntadores a cadenas
« Respuesta #4 en: Viernes 22 de Agosto de 2008, 17:20 »
0
Hiiiii...

Muchas gracias por las respuestas

ya intente lo de la "chupaza"  :D  

y sirve de maravilla... :lol:


muchas gracias y perdon por responder tan tarde :P
A menudo unas pocas horas de «prueba y ensayo» podrán ahorrarte minutos de leer manuales.
[size=150]
Dios nos Otorgo el uno y el cero....y con eso creamos un universo....[/size]

[size=109]↑°°°°ÄNÍMÄ §ÛBTÍLͧ°°°°↓[/size]