Tamaño C de una matriz pasada [duplicado]
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;
}
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:
- Obviamente, agrega un parámetro.
- Envuelva la llamada en una macro y agregue automáticamente un parámetro
- 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.
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.
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 sizeof
unarios 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 array1
se convierte implícitamente de "matriz de 100 elementos de double
" a "puntero a double
". Por tanto, el tipo de parámetro p
es 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;