Tamaño C de una matriz pasada [duplicate]

3 minutos de lectura

avatar de usuario
Salvaje

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 tiempo de compilación. Dado eso, ¿cómo se puede calcular el tamaño de una función, que se pasa a diferentes matrices en diferentes puntos de un programa? Puedo pasarlo como un 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;
}

  • Standard C gotcha: consulte el enlace a la pregunta.

    – Jon

    30 de marzo de 2011 a las 22:37

  • sizeof no tiene que evaluarse en tiempo de compilación en C99: los VLA funcionan correctamente con sizeofy su tamaño solo puede conocerse en tiempo de ejecución.

    –Carl Norum

    30 de marzo de 2011 a las 22:45

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

Excepto cuando es el operando del sizeof o unario & operadores, o es un literal de cadena que se usa 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.

Así, cuando llamas printarrayel tipo de array1 se convierte implícitamente de “matriz de 100 elementos de double“a” puntero a double.” Por lo 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;

  • Claro y conciso, gracias.

    – AlexSp3

    7 oct 2021 a las 23:02

  • Puede pasar un puntero a la matriz printarray( double (*p)[100])llamando printarray(&array1) para que pueda referirse a su matriz por *p y use sizeof *p

    – Andrea993

    10 mayo 2018 a las 21:49

Ha respondido a su propia pregunta. Se calcula en tiempo de compilación, entonces, ¿cómo es posible que ‘sizeof p’ tenga más de un valor durante el tiempo de ejecución?

Pasar la longitud como parámetro es una buena solución; de lo contrario, puede asegurarse de que sus matrices siempre terminen con algún valor especial (como cadenas y el byte nulo).

avatar de usuario
Roberto S. Barnes

Puede usar un valor centinela que es la forma en que se tratan las cadenas. El inconveniente es que tiene que iterar sobre toda la matriz para encontrar su tamaño.

Por ejemplo, cuando tienes una cadena como:

char s1[] = "foobar";

Lo que realmente tiene es una matriz de longitud 7, con el séptimo lugar siendo un carácter de terminación nula ‘\ 0’ que sirve para indicar el final de la matriz/cadena.

Otra forma de hacerlo es crear una estructura que consista en un tamaño seguido de la matriz.

avatar de usuario
Scott Duckworth

debes

  1. Pasar el tamaño de la matriz como parámetro a la función.
  2. Asegúrese de que la matriz termine con un valor conocido y deténgase cuando alcance ese valor.

¿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