Tamaño C de una matriz pasada [duplicado]

Resuelto Untamed asked hace 13 años • 7 respuestas

Posible duplicado:
cómo encontrar el tamaño de (un puntero que apunta a una matriz)

Entiendo que el operador sizeof se evalúa y reemplaza con una constante en el momento de la compilación. Dado eso, ¿cómo se puede calcular su tamaño a una función, a la que se le pasan diferentes matrices en diferentes puntos de un programa? Puedo pasarlo como parámetro a la función, pero prefiero no tener que agregar otro parámetro si no es absolutamente necesario.

Aquí hay un ejemplo para ilustrar lo que estoy preguntando:

#include <stdio.h>
#include <stdlib.h>

#define SIZEOF(a) ( sizeof a / sizeof a[0] )


void printarray( double x[], int );

int main()
{
        double array1[ 100 ];


        printf( "The size of array1 = %ld.\n", SIZEOF( array1 ));
        printf( "The size of array1 = %ld.\n", sizeof array1 );
        printf( "The size of array1[0] = %ld.\n\n", sizeof array1[0] );

        printarray( array1, SIZEOF( array1 ) );

        return EXIT_SUCCESS;
}


void printarray( double p[], int s )
{
        int i;


        // THIS IS WHAT DOESN"T WORK, SO AS A CONSEQUENCE, I PASS THE 
        // SIZE IN AS A SECOND PARAMETER, WHICH I'D RATHER NOT DO.
        printf( "The size of p calculated = %ld.\n", SIZEOF( p ));
        printf( "The size of p = %ld.\n", sizeof p );
        printf( "The size of p[0] = %ld.\n", sizeof p[0] );

        for( i = 0; i < s; i++ )
                printf( "Eelement %d = %lf.\n", i, p[i] );

        return;
}
Untamed avatar Mar 31 '11 05:03 Untamed
Aceptado

No existe una solución mágica. C no es un lenguaje reflexivo. Los objetos no saben automáticamente qué son.

Pero tienes muchas opciones:

  1. Obviamente, agrega un parámetro.
  2. Envuelva la llamada en una macro y agregue automáticamente un parámetro
  3. Utilice un objeto más complejo. Defina una estructura que contenga la matriz dinámica y también el tamaño de la matriz. Luego, pase la dirección de la estructura.
DigitalRoss avatar Mar 30 '2011 22:03 DigitalRoss

Los parámetros de función nunca tienen realmente un tipo de matriz. Cuando el compilador ve

void printarray( double p[], int s )

o incluso

void printarray( double p[100], int s )

convierte cualquiera de los dos en

void printarray( double* p, int s )

Asi sizeof(p)es sizeof(double*). Y sí, tendrás que pasar el tamaño como parámetro.

aschepler avatar Mar 30 '2011 22:03 aschepler

El problema es que tu función no recibe un valor de matriz; recibe un valor de puntero.

Excepto cuando es el operando de los operadores sizeofunarios o &, o es un literal de cadena que se utiliza para inicializar otra matriz en una declaración, una expresión de tipo "matriz de T" se convertirá al tipo "puntero a T" y su valor será la dirección del primer elemento de la matriz.

Por lo tanto, cuando llama a printarray, el tipo de array1se convierte implícitamente de "matriz de 100 elementos de double" a "puntero a double". Por tanto, el tipo de parámetro pes double *, no double [100].

En el contexto de una declaración de parámetro de función, T a[]es idéntico a T *a.

Es por eso que debe pasar el tamaño de la matriz por separado;

John Bode avatar Mar 30 '2011 23:03 John Bode