Bonjour, j'aimerais savoir c'est quoi l'intérêt d'utiliser malloc pour créer des tableaux ?
Le prof nous a dit qu'il faut l'utiliser quand on ne connait pas d'avance la taille du tableau par exemple.
Sauf qu'on peut très bien faire :
int size;
scanf("%d", &size);
int tab[size];
Pourquoi faire
int * tab = malloc(size * sizeof(int)) alors
La raison principale n'est pas la connaissance de la taille du tableau ou non. La raison principale est la duree de vie de la variable et la zone memoire ou elle est allouee:
int tab[size];
place le tableau dans la pile d'execution. D'abords, cette pile est limite en taille, typiquement quelques MB, ce qui implique que tu ne peux pas avoir de gros tableau. Mais aussi tu la tableau n'existe plus une fois que la fonction fini. Tu ne peux pas retourner ce tableau a la fonction appellante. Une fois que la fonction est termine, le tableau est retire de la pile.
Alors que quand le tableau est alloue
int* tab = malloc (size*sizeof(int));
le tableau est alloue dans le tas. Le tas n'a pas de limite memoire, il est seulement limite par la taille de la memoire de ta machine (c'est plus complique, mais faisons simple). Aussi le tas ne disparait pas quand tu quittes la fonction, donc ca te permet potentiellement de retourner a la fonction appellante le tableau qui a ete alloue.
Ce que ton prof voulait sûrement te dire, c'est si tu ne peux pas prédire la taille de ta chaîne.
Mettons qu'à un instant t elle est de taille 4, et à un autre, de taille 10, tu ne pourras pas le faire en allocation statique sur ta stack.
Mais effectivement la réponse de Godrik est bien plus complète que celle de ton professeur.
Merci je comprends mieux. Ça m'étonne que le fait qu'avec malloc on stocke dans le tas soit absent de mon cours, c'est pourtant tout l'intérêt.
Le 06 novembre 2019 à 19:53:24 mynameisflash a écrit :
Merci je comprends mieux. Ça m'étonne que le fait qu'avec malloc on stocke dans le tas soit absent de mon cours, c'est pourtant tout l'intérêt.
Effectivement. J'ai cru comprendre qu'en Fac on prenait un peu les étudiants pour des idiots en pensant qu'ils sont incapable de comprendre le fonctionnement du C, peut être que c'est pour ça que c'est absent du cours, pour "pas embrouiller les élèves".
Il y a aussi que ça dépend du compilateur (à moins que ça ai changé) pour la possibilité de mettre une valeur variable pour déclarer un tableau statique, c'est pas dans la norme. Par exemple, le compilateur microsoft ne le permet pas.
https://docs.microsoft.com/en-us/cpp/cpp/arrays-cpp?view=vs-2019
Le 07 novembre 2019 à 12:37:49 TechnoForce3 a écrit :
Il y a aussi que ça dépend du compilateur (à moins que ça ai changé) pour la possibilité de mettre une valeur variable pour déclarer un tableau statique, c'est pas dans la norme. Par exemple, le compilateur microsoft ne le permet pas.
https://docs.microsoft.com/en-us/cpp/cpp/arrays-cpp?view=vs-2019
En CPP peut être, en C, non.
Et encore, c'est que ton compilateur CPP doit wrap la syntaxe array, pour ce ça n'en soit plus une.
Tant que tu peux allouer une array avec une variable en asm, tu pourras le faire en C.
Ou alors c'est que ton compilateur ne serait pas assez intelligent pour calculer à l'avance les besoins de sa stack, et à ce moment là, autant ne pas utiliser un tel compilateur.
Après recherche, le C99 introduit les tableaux de tailles variables (avant la taille devait être déduite à la compilation) donc je sais pas pourquoi le compilateur Microsoft ne l'accepte pas.
technoforce,
les tableaux de taille variable n'ont pas ete integre dans la norme c++ je pense.
Le 07 novembre 2019 à 15:15:57 TechnoForce3 a écrit :
Après recherche, le C99 introduit les tableaux de tailles variables (avant la taille devait être déduite à la compilation) donc je sais pas pourquoi le compilateur Microsoft ne l'accepte pas.
Je veux pas trop m’avancer mais il me semble que Microsoft a mis très longtemps à supporter le c99, standard qu’il n’appréciait pas. Malheureusement sur le C, les standards mettent des plombes à être implémentés totalement ... il n’y a qu’à voir le C11 et les threads qui ne sont pas partout encore.
Le 08 novembre 2019 à 19:16:05 neytsumi a écrit :
Le 07 novembre 2019 à 15:15:57 TechnoForce3 a écrit :
Après recherche, le C99 introduit les tableaux de tailles variables (avant la taille devait être déduite à la compilation) donc je sais pas pourquoi le compilateur Microsoft ne l'accepte pas.Je veux pas trop m’avancer mais il me semble que Microsoft a mis très longtemps à supporter le c99, standard qu’il n’appréciait pas. Malheureusement sur le C, les standards mettent des plombes à être implémentés totalement ... il n’y a qu’à voir le C11 et les threads qui ne sont pas partout encore.
De facon generale, les standards mettent du temps a etre implemente. Il y a encore plein de chaine de compilation qui ne supporte pas C99. Principalement dans le domaine de l'embarque.
Personnellement, j'ecris beaucoup de C++, et je continue a ecrire du C++11 et pas une norme plus recente. Parceque je rencontre encore regulierement des chaines de compilation ou le compilateur est vieux et ne supporte pas completement les normes recentes.
Autant je suis assez enthusiaste sur le fait que C++ va finalement introduire les concepts et modules dans C++20 (c'est dans le draft, prions que ca y reste), autant je sais que les implementations vont mettre certainement 2 ans de plus a arriver.
Le 08 novembre 2019 à 19:39:44 godrik a écrit :
Le 08 novembre 2019 à 19:16:05 neytsumi a écrit :
Le 07 novembre 2019 à 15:15:57 TechnoForce3 a écrit :
Après recherche, le C99 introduit les tableaux de tailles variables (avant la taille devait être déduite à la compilation) donc je sais pas pourquoi le compilateur Microsoft ne l'accepte pas.Je veux pas trop m’avancer mais il me semble que Microsoft a mis très longtemps à supporter le c99, standard qu’il n’appréciait pas. Malheureusement sur le C, les standards mettent des plombes à être implémentés totalement ... il n’y a qu’à voir le C11 et les threads qui ne sont pas partout encore.
De facon generale, les standards mettent du temps a etre implemente. Il y a encore plein de chaine de compilation qui ne supporte pas C99. Principalement dans le domaine de l'embarque.
Personnellement, j'ecris beaucoup de C++, et je continue a ecrire du C++11 et pas une norme plus recente. Parceque je rencontre encore regulierement des chaines de compilation ou le compilateur est vieux et ne supporte pas completement les normes recentes.
Autant je suis assez enthusiaste sur le fait que C++ va finalement introduire les concepts et modules dans C++20 (c'est dans le draft, prions que ca y reste), autant je sais que les implementations vont mettre certainement 2 ans de plus a arriver.
Je suis bien d’accord avec toi mais après m’être renseigné Microsoft à en effet pendant des années refusé d’implémenter le C99 sous prétexte que le langage était « mort ». Finalement ils se sont ravisés vers 2014/2015, mais en attendant je trouve dommage qu’un si gros acteur comme MS prennent de telles décisions.