elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda sobre punteros en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda sobre punteros en C  (Leído 3,165 veces)
mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
Duda sobre punteros en C
« en: 29 Julio 2015, 18:14 pm »

Tengo este programa:
Código
  1. #include<stdio.h>
  2. #include<string.h>
  3. int main(){
  4. int x;
  5. char nombres[10][40];
  6. char *comp;
  7. for(x=0;x<10;x++){
  8. printf("Escribe un nombre:\t\tNombres: %d\n",x);
  9. scanf("%s",&nombres[x][40]);
  10. }
  11. for(x=0;x<10;x++)
  12. printf("Nombres: %s ",&nombres[x][40]);
  13. printf("\nCual quieres saber\n");
  14. scanf("%s",comp);
  15. for(x=0;x<10;x++){
  16. if(strcmp(nombres[x],comp)==0)
  17. printf("Si que esta\n");
  18. }
  19. return 0;
  20. }
  21.  
Pero no tengo mucha idea de por qué debo declarar 'comp' como un puntero o por qué para escanear 'nombres' debo usar "&", o por qué 'comp' no lo recibo con un "&" en el scanf.
¿Un array es un puntero? Como va esto xd que se me dan muy mal los punteros


En línea

Justicia es dar a cada uno lo que se merece
joecarl

Desconectado Desconectado

Mensajes: 24



Ver Perfil
Re: Duda sobre punteros en C
« Respuesta #1 en: 29 Julio 2015, 21:15 pm »

Sí, los arrays funcionan de forma similar a los punteros. Es posible que el programa te funcione pero eso no quiere decir que esté bien, de hecho no lo está, ese programa tiene varios fallos.

El primero:
Código
  1. scanf("%s",&nombres[x][40]);
Ahí realmente deberias poner:
Código
  1. scanf("%s",nombres[x]);

Al igual que
Código
  1. printf("Nombres: %s ",&nombres[x][40]);
Que debería ser:
Código
  1. printf("Nombres: %s ",nombres[x]);

Por último, has declarado comp como un puntero a char, pero no estas reservando ningún espacio en memoria para almacenarla, sin embargo luego estas tratando de llenarla con scanf("%s",comp); con lo que estás escribiendo en zonas de memoria no reservadas. Para evitar esto declara comp como una cadena de caracteres: char comp[40];

EDIT: también puedes declarar comp como un puntero y luego reservar el espacio dinámicamente:

Código
  1. char *comp;
  2. comp= malloc(40*sizeof(char));
  3. //....
  4. free(comp);
  5.  
Pero en este caso no merece la pena ya que es un programa muy simple, solo quería mostrarte las diferentes posibilidades que hay.


« Última modificación: 29 Julio 2015, 21:20 pm por joecarl » En línea

mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
Re: Duda sobre punteros en C
« Respuesta #2 en: 29 Julio 2015, 21:36 pm »

¿A qué te refieres con?
no estas reservando ningún espacio en memoria para almacenarla, sin embargo luego estas tratando de llenarla con scanf("%s",comp); con lo que estás escribiendo en zonas de memoria no reservadas.
Ya te digo que en punteros estoy muy verde y no tengo ni idea, llevo parte de la tarde intentando entenderlo y no sé, se me desmonta todo cuando hago un programa porque no entiendo que mierdas hago mal xd
En línea

Justicia es dar a cada uno lo que se merece
joecarl

Desconectado Desconectado

Mensajes: 24



Ver Perfil
Re: Duda sobre punteros en C
« Respuesta #3 en: 29 Julio 2015, 22:33 pm »

A ver, cuando escribes
Código
  1. char *comp;
estás reservando en memoria una sola variable que almacenará un puntero a char. Sin embargo tu necesitas reservar una variable para cada carácter, por eso es necesario crear un array
Código
  1. char comp[40];
De esa manera reservas 40 variables en memoria y tienes espacio para 40 caracteres (en realidad para 39, ya que el ultimo debe dejarse libre para el carácter nulo que indica la finalización de cadena).

El nombre de un array devuelve la dirección de memoria del primer elemento del array, es decir en este caso escribir comp es lo mismo que escribir &comp[0]

Al llamar a scanf("%s",comp) estás haciendo que los caracteres introducido por teclado se guarden en la memoria, la primera dirección de memoria en la que se guarda el primer carácter es la que le pasamos por parámetro, en este caso es la apuntada comp, el segundo carácter se guardara en esa misma direcion+1 y así hasta terminar.

Por tanto, si declaras comp como puntero y no reservas espacio en memoria y luego intentas llenar la memoria sin haberla reservado previamente puedes dar lugar a error o funcionamientos impredecibles.
En línea

mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
Re: Duda sobre punteros en C
« Respuesta #4 en: 29 Julio 2015, 22:46 pm »

A ver, cuando escribes
Código
  1. char *comp;
estás reservando en memoria una sola variable que almacenará un puntero a char. Sin embargo tu necesitas reservar una variable para cada carácter, por eso es necesario crear un array
Código
  1. char comp[40];
De esa manera reservas 40 variables en memoria y tienes espacio para 40 caracteres (en realidad para 39, ya que el ultimo debe dejarse libre para el carácter nulo que indica la finalización de cadena).

El nombre de un array devuelve la dirección de memoria del primer elemento del array, es decir en este caso escribir comp es lo mismo que escribir &comp[0]

Al llamar a scanf("%s",comp) estás haciendo que los caracteres introducido por teclado se guarden en la memoria, la primera dirección de memoria en la que se guarda el primer carácter es la que le pasamos por parámetro, en este caso es la apuntada comp, el segundo carácter se guardara en esa misma direcion+1 y así hasta terminar.

Por tanto, si declaras comp como puntero y no reservas espacio en memoria y luego intentas llenar la memoria sin haberla reservado previamente puedes dar lugar a error o funcionamientos impredecibles.
Ostias, gracias por tu tiempo, ya lo he entendido. Me estoy poniendo a tope con punteros y con lo que me has dicho ya lo he pillado jeje
En línea

Justicia es dar a cada uno lo que se merece
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
duda sobre punteros
Ejercicios
maryrisas 1 4,133 Último mensaje 23 Febrero 2006, 17:59 pm
por [[JONAS]]
[duda] sobre punteros y signed
Programación C/C++
AlxSpy 6 3,602 Último mensaje 9 Enero 2011, 20:13 pm
por AlxSpy
Duda sobre punteros
Programación C/C++
adissenys 3 2,411 Último mensaje 17 Noviembre 2012, 22:59 pm
por Ferno
Pequeña duda sobre punteros « 1 2 »
Programación C/C++
PabloPbl 15 5,015 Último mensaje 26 Diciembre 2015, 12:44 pm
por kondrag_X1
ayuda con una duda sobre punteros
Programación C/C++
DobleGa 1 1,766 Último mensaje 7 Mayo 2017, 17:18 pm
por CalgaryCorpus
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines