Encuentre el tamaño de la matriz de enteros recibida como argumento para una función en c [duplicate]

5 minutos de lectura

avatar de usuario
Sunil Hari

Me gustaría encontrar el tamaño de la matriz de enteros que se pasa como argumento a una función. Aquí está mi código

void getArraySize(int arr[]){
  int len = (sizeof(arr)/sizeof(arr[0])
  printf("Array Length:%d\n",len);
}

int main(){
 int array[] = {1,2,3,4,5};
 getArraySize(array);
 return 0;
}

Estoy recibiendo la siguiente advertencia

sizeof on array function parameter will return
size of 'int *' instead of 'int []' [-Wsizeof-array-argument]

Por favor, ayuda para que pueda encontrar la longitud de la matriz de enteros dentro de la function getArraySize

Sin embargo soy capaz de encontrar el tamaño de la array dentro de main función. Dado que se pasa como un pointerno soy capaz de encontrar el length de con en el function.

Sin embargo, tengo una idea. Podría poner esto en un try/catch cuadra(C no tiene intento de captura, solo puentes que dependen del sistema operativo) y bucle hasta que obtenga un segmentation fault.

¿Hay alguna otra forma que pueda usar para encontrar la longitud de integer array dentro de function

  • int array = {1,2,3,4,5}; ???

    – Sourav Ghosh

    5 de septiembre de 2014 a las 6:46

  • Gracias @SouravGhosh.

    – Sunil Hari

    5 de septiembre de 2014 a las 6:46

  • @ArpitSrivastava ???????

    – Sunil Hari

    5 de septiembre de 2014 a las 7:30

  • mi error… no he visto las etiquetas

    – Arpit Srivastava

    5 de septiembre de 2014 a las 7:50


No puedes hacerlo de esa manera. Cuando pasa una matriz a una función, se descompone en un puntero al primer elemento, momento en el que se pierde el conocimiento de su tamaño.

Si desea saber el tamaño de una matriz pasada a la función, debe resolverlo antes de decaer y pasar esa información con la matriz, algo así como:

void function (size_t sz, int *arr) { ... }
:
{
    int x[20];
    function (sizeof(x)/sizeof(*x), x);
}

  • Entonces siempre hay que pasarlo como argumento??@paxdiablo

    – Sunil Hari

    5 de septiembre de 2014 a las 6:53

  • @SunilHari Sí arr en la función principal no es lo mismo que en getArraySize! En función getArraySize declaración, nula int arr[] es igual que int * arr y arr es un puntero pero no una matriz. — ese es el mensaje del compilador que está recibiendo.

    –Grijesh Chauhan

    5 de septiembre de 2014 a las 6:54


  • @Sunil: sí, debe evaluar el tamaño en el alcance donde todavía tiene acceso como una matriz, no después de que se deteriore.

    – pax diablo

    5 de septiembre de 2014 a las 6:55


  • @paxdiablo:Entonces traté de hacer algo que no es posible en c. :).¿Es poner puentes un buen enfoque?

    – Sunil Hari

    5 de septiembre de 2014 a las 6:56

  • Voté esta respuesta porque me ayudó a resolver el problema en cuestión. Sin embargo, debo admitir que me sorprendió ver que esto no es fácilmente posible en C; nunca podré entender por qué C se volvió tan popular como lenguaje, excluyendo, por supuesto, la respuesta obvia de que conduce a programas rápidos. Pero desde el punto de vista de la usabilidad, tener que hacer tantas soluciones alternativas es bastante… chocante.

    – shevy

    12 de marzo de 2020 a las 12:30

La matriz decae a un puntero cuando se pasa.

Entonces, sizeof solo funciona para encontrar la longitud de la matriz si la aplica a la matriz original.

Por lo tanto, debe pasar la longitud de la matriz como argumento separado para funcionar.

Cuando pasa una matriz a una función, su dirección se pasa a la función como un puntero.

Entonces void getArraySize(int arr[]) es equivalente a void getArraySize(int* arr).

Como resultado, sizeof(arr) rendimientos sizeof(int*)que es probablemente no Lo que quieras.

Puedes usar con seguridad sizeof(arr)/sizeof(arr[0]) sólo dentro del ámbito de la declaración de arr.

En su caso, el alcance de la declaración de arr es función main.

  • Ok, ¿qué sucede si declara la matriz globalmente? Entonces, ¿es posible?

    – Sunil Hari

    5 de septiembre de 2014 a las 6:54

  • @SunilHari: Sí, porque entonces el alcance de la declaración de arr incluirá todas las funciones en ese archivo.

    – barak manos

    5 de septiembre de 2014 a las 6:55

  • @SunilHari Las variables globales son malas

    –Grijesh Chauhan

    5 de septiembre de 2014 a las 7:01

  • @barakmanos 🙂 Gracias

    – Sunil Hari

    5 de septiembre de 2014 a las 7:02

  • @SunilHari: De nada 🙂

    – barak manos

    5 de septiembre de 2014 a las 7:07

avatar de usuario
Satish

No hay manera de determinar la longitud dentro de la función. Sin embargo pasas arr, sizeof(arr) siempre devolverá el tamaño del puntero. Entonces, la mejor manera es pasar el número de elementos como un argumento separado.

sizeof solo funciona para encontrar la longitud de la matriz si la aplica a la matriz original.

int arr[5]; //real array. NOT a pointer
sizeof(arr); // :)

Sin embargo, en el momento en que la matriz se convierte en un puntero, sizeof dará el tamaño del puntero y no el de la matriz.

void getArraySize(int arr[]){
sizeof(arr); // will give the pointer size
}

Hay algún razonamiento de por qué esto sucedería. ¿Cómo podríamos hacer las cosas para que una matriz C también conozca su longitud?

Una primera idea sería no tener arreglos que se descompongan en punteros cuando se pasan a una función y continuar manteniendo la longitud del arreglo en el sistema de tipos.

Cuando pasa una matriz a una función, se descompone en un puntero. Entonces el sizeof función devolverá el tamaño de int *. Esta es la advertencia de que su compilador se está complaciendo:

sizeof on array function parameter will return size of 'int *' instead of 'int []'

Como sugerí cuando pasa la matriz a la función, también necesita pasar el Número de elementos:

getArraySize(array, 5); // 5 is the number of elements in array

Atrápalo por-

void getArraySize(int arr[], int element){
// your stuff
}

Otra forma general de calcular el tamaño de la matriz-

void getArraySize(int arr[], int len){
  // your stuff
  printf("Array Length:%d\n",len);
}

int main(){
 int array[] = {1,2,3,4,5};
 int len = (sizeof(arr)/sizeof(arr[0]); // will return the size of array
 getArraySize(array, len);
 return 0;
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad