es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Intercambiar elementos de dos estructuras

He simplificado mi pregunta a este pequeño programa en C. Ten en cuenta que estoy aprendiendo C por mi cuenta. ¡Estoy teniendo verdaderos problemas con los punteros!


#include <stdio.h> #include <stdlib.h> typedef struct Elmt_ { int *i; struct Elmt_ *next; } E; void swap_1(E *x, E *y) { int *temp = NULL; temp = x->i; x->i = y->i; y->i = temp; } void swap_2(E *x, E *y) { int *temp=NULL; temp = malloc(sizeof(int)); *temp = *(x->i); *(x->i) = *(y->i); *(y->i) = *temp; } int main() { E *p, *q, *r, *s; int a, b; a = 8; b = 50; p = malloc(sizeof(E)); q = malloc(sizeof(E)); p->i = &a; p->next = NULL; q->i = &b; q->next = NULL; printf("Inicialmente, *(p->i)=%d *(q->i)=%d\n", *(p->i), *(q->i)); swap_1(p,q); printf("Después de swap_1, *(p->i)=%d *(q->i)=%d\n", *(p->i), *(q->i)); r = malloc(sizeof(E)); s = malloc(sizeof(E)); r->i = &a; s->i = &b; printf("Inicialmente, *(r->i)=%d *(s->i)=%d\n", *(r->i), *(s->i)); swap_2(r,s); printf("Después de swap_2, *(r->i)=%d *(s->i)=%d\n", *(r->i), *(s->i)); return 0; }

Pregunta: En el programa anterior, ¿es swap_1 o swap_2 la forma correcta de intercambiar el valor entero apuntado por i?

Veo que ambas funciones parecen intercambiar correctamente los valores dados como argumento.

“`
$ ./a.out
Inicialmente, *(p->i)=8 *(q->i)=50
Después de swap_1, *(p->i)=50 *(q->i)=8

Inicialmente, *(r->i)=8 *(s->i)=50
Después de swap_2, *(r->i)=50 *(s->i)=8
“`</stdlib.h></stdio.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Tanto swap_1 como swap_2 intercambian correctamente los valores enteros apuntados por i.

    swap_1 intercambia los punteros a los valores enteros directamente, mientras que swap_2 utiliza la asignación de memoria dinámica para crear espacio para un entero temporal que contenga el valor de uno de los enteros que se intercambian.

    Ambos enfoques son válidos, pero swap_1 es más eficiente ya que no requiere asignación de memoria. Sin embargo, swap_2 podría utilizarse en casos donde el tamaño del valor intercambiado es significativamente mayor que un entero, donde sería necesaria la asignación dinámica de memoria.

Comments are closed.