Saltar al contenido

pasar un array a una función por valor

El paso a paso o código que encontrarás en este artículo es la resolución más sencilla y válida que hallamos a esta duda o problema.

Solución:

Porque el array se está pasando por valor, una copia exacta de la array se hace y se coloca en la pila.

Esto es incorrecto: la array en sí mismo no está siendo copiado, solo se pasa una copia del puntero a su dirección al destinatario (se coloca en la pila). (Independientemente de si declara el parámetro como int[] o int*eso se descompone en un puntero.) Esto le permite modificar el contenido de la array desde dentro de la función llamada. Por lo tanto, este

Porque el array pasó a byval_func() es una copia del original arraymodificando el array dentro de byval_func() La función no tiene efecto en el original. array.

está completamente mal (felicitaciones a @Jonathan Leffler por su comentario a continuación). Sin embargo, reasignar el puntero dentro de la función no cambiará el puntero al original array fuera de la función.

Quema ese libro. Si desea un FAQ real de C que no haya sido escrito por un programador principiante, use este: http://c-faq.com/aryptr/index.html.

En cuanto a la sintaxis, estrictamente hablando usted no poder pasar un array por valor en C.

void func (int* x); /* this is a pointer */

void func (int x[]); /* this is a pointer */

void func (int x[10]); /* this is a pointer */

Sin embargopara que conste, hay un truco sucio en C que le permite pasar un array por valor en C. ¡No intentes esto en casa! Porque a pesar de este truco, todavía nunca hay una razón para pasar un array por valor.

typedef struct

  int my_array[10];
 Array_by_val;

void func (Array_by_val x);

¿No es esto incorrecto ya que las matrices nunca se pueden pasar por valor?

Exactamente. No puedes pasar un array por valor en C.

Eché un vistazo a la parte citada del libro y la fuente de esta confusión o error se encontró bastante rápido.

el autor no sabia de eso *i es equivalente a i[] cuando se proporciona como parámetro de una función. La última forma fue inventada para ilustrar explícitamente al lector del código, que i apunta a un arrayque es una gran fuente de confusión, como bien lo muestra esta pregunta.

Lo que creo que es divertido, que el autor de la parte particular del libro o al menos una de las otras partes (porque el libro tiene 5 autores en total) o uno de los 7 los correctores no mencionaron al menos la frase:

Cuando el byval_func() se llama funcion, pasas la dirección de El array para byval_func():

Con al menos eso, deberían haber notado que hay un conflicto. Dado que pasa una dirección, es solo una dirección. No ocurre nada por arte de magia que convierta una dirección en una nueva array.


Pero volvamos a la pregunta en sí:

No puedes pasar un array como lo es por valor en C, como ya pareces saber tu mismo. Pero puedes hacer tres (puede haber más, pero ese es mi estado actual) cosas, que podrían ser una alternativa dependiendo del caso único, así que comencemos.

  1. Encapsular un array en una estructura (como se menciona en otras respuestas):
#include 

struct a_s 
   int a[20];
;

void foo (struct a_s a)

   size_t length = sizeof a.a / sizeof *a.a;

   for(size_t i = 0; i < length; i++)
   
       printf("%dn",a.a[i]);
   


int main()

   struct a_s array;

   size_t length = sizeof array.a / sizeof *array.a;

   for(size_t i = 0; i < length; i++)
   
       array.a[i] = 15;
    

   foo(array);

  1. Pase por puntero pero también agregue un parámetro para determinar el tamaño del array. En la función llamada se hace una nueva array con esa información de tamaño y asignado con los valores de la array en la persona que llama:
#include 

void foo (int *array, size_t length)

   int b[length];

   for(size_t i = 0; i < length; i++)
   
       b[i] = array[i];
       printf("%dn",b[i]);
   


int main()

   int a[10] = 0,1,2,3,4,5,6,7,8,9;

   foo(a,(sizeof a / sizeof *a));

  1. Evite definir arreglos locales y solo use uno array con alcance mundial:
#include 

int a[10];
size_t length = sizeof a / sizeof *a;

void foo (void)

   for(size_t i = 0; i < length; i++)
   
       printf("%dn",a[i]);
   


int main()
   
   for(size_t i = 0; i < length; i++)
   
       a[i] = 25;
    

   foo();

Tienes la posibilidad recomendar este artículo si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *