referenciación de memoria en C usando estructura

Estoy aprendiendo sobre estructuras en C. Cuando pasamos una estructura como argumento a otra función, ¿qué estamos haciendo exactamente? ¿estamos copiando todos los valores de los miembros en otra función? Cuando pasamos una matriz como argumento, estamos pasando la primera dirección de la matriz - matriz[0]. las cosas no parecen tan simples con la estructura. Supongo que no estamos copiando ningún valor ni pasando ninguna dirección. le estamos diciendo al compilador que esté listo para usar, cuando sea necesario, las direcciones de los miembros de la estructura que se está pasando. Aunque no estoy seguro ... cualquier ayuda es apreciada.

preguntado el 03 de mayo de 12 a las 15:05

4 Respuestas

#include <stdio.h>

struct foo {
  int a;
}

void by_value(struct foo x) {
  x.a = 10;
}

void by_reference(struct foo* x) {
  x->a = 10;
}

int main(int argc, char* argv[]) {
  struct foo v;
  v.a = 5;

  by_value(v);
  printf("%d\n", v.a);

  by_reference(&v);
  printf("%d\n", v.a);

  return 0;
}

Esto debería responder a su pregunta si lo compila y lo ejecuta.

contestado el 03 de mayo de 12 a las 15:05

@Saurabh Si lo pasa por valor, se copiará todo lo que contiene. No importa el número de miembros. Pero tenga en cuenta que la copia es superficial. Esto significa que si la estructura contiene punteros, se copiará el valor del puntero, no lo que apunta. - Honky Tonk

Al igual que los arreglos, ¿las estructuras pueden declararse globalmente? o son las estructuras función específica? - KawaiKx

@Saurabh Una estructura es un tipo, nada más. Si desea declarar una variable con un tipo de estructura globalmente, funciona de la misma manera que declarar cualquier otro tipo globalmente. Pero, si lo declara globalmente para no tener que enviar una referencia a una estructura cuando realiza una llamada de función, está resolviendo el problema equivocado. Mantenga siempre el número de variables globales al mínimo. - Honky Tonk

Las estructuras se pueden pasar tanto por valor como por referencia. Si hay una estructura grande, es recomendable pasar por referencia; de lo contrario, se puede consumir una gran cantidad de espacio de pila, ya que se hará una copia de la estructura pasada en la función llamada. Lea esto para saber más sobre el paso de estructura.

¿Hay alguna desventaja de pasar estructuras por valor en C, en lugar de pasar un puntero?

contestado el 23 de mayo de 17 a las 12:05

Entonces, las estructuras no pueden estar disponibles globalmente para todas las funciones en el archivo de código fuente, a diferencia de las matrices. ¿Tengo razón al decir eso? ¿deben pasarse cada vez que otras funciones los necesitan? - KawaiKx

@Saurabh No. Puede haber estructuras globales como matrices que pueden acceder a todas las funciones. El hecho de que se puedan pasar por valor no significa que sea la única forma de acceder a ellos entre funciones. - Pavan Manjunath

Depende de cómo struct esta pasado:

  • si se pasa por valor, se realiza una copia y se realizan cambios dentro de la función a la struct no son visibles para la persona que llama
  • si se pasa por referencia, no se realiza una copia y se realizan cambios dentro de la función a la struct son visibles para la persona que llama

Por ejemplo:

#include <stdio.h>

struct X {
  int value;
};

void pass_by_value(struct X a_x)
{
    a_x.value = 10;
    printf("by_value(address=%p, value=%d)\n", &a_x, a_x.value);
}

void pass_by_ref(struct X* a_x)
{
    a_x->value = 20;
    printf("by_ref(address=%p, value=%d)\n", a_x, a_x->value);
}

int main()
{
    struct X my_x = { 1 };

    printf("my_x(address=%p, value=%d)\n\n", &my_x, my_x.value);

    pass_by_value(my_x);
    printf("my_x(address=%p, value=%d)\n\n", &my_x, my_x.value);

    pass_by_ref(&my_x);
    printf("my_x(address=%p, value=%d)\n\n", &my_x, my_x.value);

    return 0;
}

Salida:

my_x(address=0013FF74, value=1)

by_value(address=0013FF78, value=10)
my_x(address=0013FF74, value=1)

by_ref(address=0013FF74, value=20)
my_x(address=0013FF74, value=20)

contestado el 03 de mayo de 12 a las 15:05

Aquí ha utilizado sólo un miembro en la estructura. supongamos que hay muchos miembros en la estructura. en tal caso, ¿qué pasaría por ' pass_by_value(my_x)' ? y ¿qué imprimiría con ' &my_x' ? gracias por su paciencia.. - KawaiKx

No hace ninguna diferencia (aparte de requerir más espacio). - hmjd

@hmjd: ¿Por qué la salida de la dirección no está en formato hexadecimal? - Jack

Antes de llamar a una función, el compilador inserta los parámetros en la pila primero y luego invoca la función. Entonces, la función puede obtener el parámetro de la pila.

Cuando se pasa por address , la dirección se pasa a la función. Y el compilador también procesará la memoria de parámetros, que se llama "Alineación de memoria" o algo así, para mejorar el rendimiento. Entonces, en su función, puede convertir fácilmente ese bloque de memoria en una estructura.

Cuando se pasa por valor, el compilador hace frente al parámetro y pasa la dirección del parámetro copiado a su función.

Por cierto, en un proceso, la dirección de memoria es la misma. Cualquier función puede usarlo.

contestado el 03 de mayo de 12 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.