Disons que je veux faire une boucle sur un tableau, j'ai donc utilisé une boucle for basique et accédé à chaque élément avec l'index mais que se passe-t-il si je ne sais pas combien de temps mon tableau fait?
#include <stdio.h>
#include <stdlib.h>
int main(){
int some_array[] = {2,3,5,7,2,17,2,5};
int i;
for (i=0;i<8;i++){
printf("%d\n",some_array[i]);
}
return 0;
}
4 Réponses :
Faites comme ceci:
foo(some_array, sizeof(some_array)/sizeof(some_array[0]));
Mais méfiez-vous. Cela ne fonctionnera pas si vous passez le tableau à une fonction. Si vous souhaitez l'utiliser dans une fonction, écrivez la fonction afin de transmettre également la taille en argument. Comme ceci:
void foo(int *arr, size_t size);
Et appelez-le comme ceci:
for (i=0; i<sizeof(some_array)/sizeof(some_array[0]); i++){
printf("%d\n",some_array[i]);
}
Mais si vous avez une fonction qui prend juste un pointeur , il n'y a absolument aucun moyen standard d'en connaître la taille. Vous devez l'implémenter vous-même.
Merci! un moyen de le faire fonctionner quoi qu'il arrive? car cela me limite un peu si je ne peux pas l'utiliser dans les fonctions.
@DarkLeader J'ai écrit comment le faire pour les fonctions.
pouvez-vous expliquer pourquoi divisez-vous la taille du tableau par la taille du premier élément?
taille du tableau par la taille du premier élément - la taille du tableau est égale à la taille d'un élément multipliée par le nombre d'éléments. Donc, en divisant la taille du tableau par la taille d'un élément, vous obtenez ...
Vous pouvez utiliser sizeof () pour obtenir la taille du tableau en octets puis diviser le résultat par la taille du type de données:
size_t n = sizeof(some_array)/sizeof(some_array[0]);
donc la fonction sizeof () renvoie la taille du tableau en octets? ok merci, je ne savais pas ça. pourquoi divisez-vous cela par le premier élément du tableau? peut-être que je ne comprends tout simplement pas la deuxième partie.
@DarkLeader sizeof (some_array) vous indique combien d'octets de mémoire le tableau prend. sizeof (some_array [0]) vous indique combien d'octets un seul élément du tableau occupe. Ainsi, sizeof (some_array) / sizeof (some_array) vous donne le nombre d'éléments dans le tableau. Notez également que cela ne fonctionne que pour les tableaux statiques; si vous allouez dynamiquement un tableau, par exemple int * arr = malloc (sizeof (int) * 42) , puis sizeof (arr) renvoie la taille du pointeur , pas la taille du tableau vers lequel il pointe.
Juste une petite remarque, mais sizeof n'est pas une fonction. C'est un opérateur. Et c'est pourquoi nous n'utilisons pas de parenthèses sauf si nécessaire. sizeof someearray / sizeof someearray [0] est mieux.
@giusti Eh bien, s'il vaut mieux ou non sauter les parenthèses, c'est subjectif.
Ils ne sont pas nécessaires. Ils ne contribuent pas à la clarification. La seule raison pour laquelle ils sont utilisés est que les gens apprennent à les utiliser. C'est particulièrement plus déroutant parce que les gens écrivent généralement sizeof (type) sans espaces, comme s'il s'agissait d'un appel de fonction. Cela transmet donc une idée erronée à 1000%. Le code devrait signifier ce qu'il est réellement. sizeof est un opérateur; les parenthèses ne sont requises que pour les noms de type. Écrivez comme ça.
En général, vous pouvez calculer la taille du tableau avec:
sizeof(ArrayName)/sizeof(ArrayType)
mais cela ne fonctionne pas avec les tableaux créés dynamiquement
Vous devez connaître la taille du tableau. C'est l'une des règles les plus importantes de la programmation en C. Vous, le programmeur, êtes toujours responsable de la taille de votre tableau. Bien sûr, si vous avez un tableau de pile ou un tableau statique, vous pouvez faire ceci:
int size = 10; int *array = malloc(sizeof *array * 10);
Mais comme vous pouvez le voir, vous aviez besoin de la variable size dans le premier lieu. Alors à quoi ça sert d'essayer de découvrir la taille si vous étiez déjà obligé de la connaître?
Et si vous essayez de passer ce tableau à n'importe quelle fonction
void some_function(int *array) {
/* Iterate over the elements until a sentinel is found.
* In this example, the sentinel is a negative number.
* Sentinels vary from application to application and
* implicitly tell you the size of the array.
*/
for (int i = 0; array[i] >= 0; i++) {
// do something with array[i]
}
}
vous devez passer la taille du tableau aussi, car une fois que le tableau n'est plus dans la même fonction qui l'a déclaré, il n'y a aucun mécanisme pour retrouver sa taille (sauf si le contenu du array indique la taille d'une manière ou d'une autre, comme stocker le nombre d'éléments dans array [0] ou utiliser une sentinelle pour vous permettre de compter le nombre d'éléments).
some_function(array); /