CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet résolu : Pourquoi malloc en C

DébutPage précedente
1
Page suivantePage suivante
mynameisflash mynameisflash
MP
Niveau 12
06 novembre 2019 à 16:37:50

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

Message édité le 06 novembre 2019 à 16:42:47 par mynameisflash
godrik godrik
MP
Niveau 22
06 novembre 2019 à 17:24:19

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.

Raidden36 Raidden36
MP
Niveau 6
06 novembre 2019 à 18:31:30

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.

Message édité le 06 novembre 2019 à 18:32:43 par Raidden36
mynameisflash mynameisflash
MP
Niveau 12
06 novembre 2019 à 19:53:24

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.

Raidden36 Raidden36
MP
Niveau 6
06 novembre 2019 à 22:56:17

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".

TechnoForce3 TechnoForce3
MP
Niveau 36
07 novembre 2019 à 12:37:49

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

Raidden36 Raidden36
MP
Niveau 6
07 novembre 2019 à 14:53:21

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.

Message édité le 07 novembre 2019 à 14:55:18 par Raidden36
Raidden36 Raidden36
MP
Niveau 6
07 novembre 2019 à 14:58:53

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.

TechnoForce3 TechnoForce3
MP
Niveau 36
07 novembre 2019 à 15:15:57

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.

Message édité le 07 novembre 2019 à 15:16:04 par TechnoForce3
godrik godrik
MP
Niveau 22
07 novembre 2019 à 16:02:40

technoforce,
les tableaux de taille variable n'ont pas ete integre dans la norme c++ je pense.

neytsumi neytsumi
MP
Niveau 12
08 novembre 2019 à 19:16:05

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.

godrik godrik
MP
Niveau 22
08 novembre 2019 à 19:39:44

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.

neytsumi neytsumi
MP
Niveau 12
09 novembre 2019 à 11:08:13

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.

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment