Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: maxim_o en 24 Junio 2016, 18:28 pm



Título: Problema con punteros.
Publicado por: maxim_o en 24 Junio 2016, 18:28 pm
Hola! Tengo un problema con unos punteros. Quiero pasar a una función un puntero a un doble puntero sin inicializar y dos cadenas de texto. Y en esa función me reserve espacio en la matriz de manera dinámica y me asigne esas cadenas, pero me tira un fallo de acceso de memoria al acceder al segundo miembro del array. Aquí el código:

Código
  1.  
  2. void copia(char *destino,char *origen){
  3.     int i=0;
  4.  
  5.     for(i=0;origen[i]!='\0';i++)
  6.  destino[i] = origen[i];
  7.  
  8.     destino[i]='\0';
  9.  
  10. }
  11. void funcion(char ***arg1, char *arg2, char *arg3){
  12.      *arg1= (char **)malloc(2*(sizeof(char *)));
  13.      *arg1[0] = (char *)malloc(5*sizeof(char)); //"HOLA\0"
  14.      *arg1[1] = (char *)malloc(6*sizeof(char)); //"ADIOS\0"
  15.      copia(*arg1[0],"HOLA");
  16.      copia(*arg1[1],"ADIOS");
  17. }
  18.  
  19.  
  20. int main(){
  21.  
  22.      char **ptr;
  23.      funcion(&ptr,"HOLA", "ADIOS");
  24.      printf("%s",ptr[0]);
  25.      printf("%s",ptr[1]);
  26. }
  27.  
  28.  
  29.  
  30.  
  31.  


Título: Re: Problema con punteros.
Publicado por: AlbertoBSD en 24 Junio 2016, 23:28 pm
Hola no he encontrado el erro sin embargo cambie la forma de acceder a los apuntadores y funciono bien, aun asi estoy intrigado.

Te dejo el codigo.

Código
  1. void funcion(char ***arg1, char *arg2, char *arg3){
  2. *arg1= (char **)malloc(2*(sizeof(char *)));
  3. arg1[0][0] = (char *)malloc(5*sizeof(char)); //"HOLA\0"
  4. arg1[0][1] = (char *)malloc(6*sizeof(char)); //"ADIOS\0"
  5. copia(arg1[0][0],arg2);
  6. copia(arg1[0][1],arg3);
  7. }
  8.  
  9. int main(){
  10. char **ptr;
  11. funcion(&ptr,"HOLA\0", "ADIOS\0");
  12. printf("%s\n",ptr[0]);
  13. printf("%s\n",ptr[1]);
  14. }

Saludos!


Título: Re: Problema con punteros.
Publicado por: class_OpenGL en 24 Junio 2016, 23:29 pm
El problema es cuestión de prioridades. Los corchetes tienen prioridad sobre el asterisco, así que cuando haces *arg1[1] es como si hicieras *(arg1[1]). Para solucionar el problema, tendrías que poner paréntesis para que el asterisco tome prioridad: (*arg1)[1]