Dupliquer possible:
[.____] Comment trouver la taille de "un pointeur pointant sur un tablea
Je comprends que la taille de l'opérateur est évaluée et remplacée par une constante au moment de la compilation. Étant donné que, comment une fonction peut être transmise de tableaux différents à différents moments d'un programme, a-t-il été calculé? Je peux le transmettre en tant que paramètre à la fonction, mais je préfère ne pas avoir à ajouter un autre paramètre si je n'ai absolument pas besoin.
Voici un exemple pour illustrer ce que je demande:
#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;
}
Il n'y a pas de solution magique. C n'est pas une langue réfléchissante. Les objets ne savent pas automatiquement ce qu'ils sont.
Mais vous avez beaucoup de choix:
Le problème est que votre fonction ne reçoit pas de valeur de matrice; Il reçoit une valeur de pointeur.
Sauf quand c'est l'opérande du sizeof
ou unarys &
opérateurs, ou il s'agit d'un littéral à chaîne utilisé pour initialiser un autre tableau dans une déclaration, une expression de type "tableau de T
" sera convertie en type "pointeur sur T
" et Sa valeur sera l'adresse du premier élément de la matrice.
Ainsi, lorsque vous appelez printarray
, le type de array1
est implicitement converti de "Tableau de 100 éléments de double
" à "pointeur sur double
". Ainsi, le type de paramètre p
est double *
, ne pas double [100]
.
Dans le contexte d'une déclaration de paramètre de fonction, T a[]
est identique à T *a
.
C'est pourquoi vous devez transmettre la taille de la matrice séparément;
Vous avez répondu à votre propre question. Il est calculé au moment de la compilation, alors comment "Taille de P" peut-il avoir plus d'une valeur pendant l'exécution?
Passer la longueur en tant que paramètre est une solution fine, sinon vous pouvez vous assurer que vos matrices se terminent toujours par une valeur spéciale (comme des cordes et l'octet null).
Vous pouvez utiliser une valeur sentinelle qui est la façon dont les chaînes sont traitées. L'inconvénient est que vous devez introduire sur toute la matrice pour trouver sa taille.
Par exemple, lorsque vous avez une chaîne telle que:
char s1[] = "foobar";
Ce que vous avez réellement, c'est un tableau de longueur 7, la septième endroit étant un NULL Terminant Char '\ 0' qui sert à indiquer la fin de la matrice/chaîne.
Une autre façon que vous puissiez le faire est de créer une structure qui consiste en une taille suivie de la matrice.
Vous devez soit
Si votre tableau est NULL terminé, vous pouvez itérer via le tableau et trouver la dernière valeur. De nombreux opérateurs de cordes en C fonctionnent de cette façon
Sinon, vous n'avez pas beaucoup de choix.
tailleof retournera la taille de P, qui est un pointeur et sera égal à votre taille int