Cette question est une continuation de Calculement d'appel Malloc, mais travaille ailleurs
J'ai essayé le programme suivant et je l'ai trouvé fonctionnant (c'est-à-dire ne pas casser - et cela a été mentionné dans le lien mentionné ci-dessus aussi). Je suis peut-être chanceux de le faire travailler, mais je recherche une explication raisonnable de l'experts sur la raison pour laquelle cela fonctionne ?! p>
Voici une compréhension de base sur l'attribution de Ainsi, lorsque nous créons un tableau p> Le code de code est comme suit: p> éditer:
Ok dis dire si je fais ce qui suit par erreur em> stry> p> est un moyen de capturer (pendant la compilation en utilisant Tout Mémoire code > Utilisation de MALLOC () CODE> WRT Structures code> et Pointants CODE> P>
MALLOC (Tailleof (Silf A) * N) Code> Allocates N code> Nombre de type struct A code> éléments. Et, cet emplacement de mémoire peut être stocké et accédé à l'aide d'un pointeur-à-type- "struct A" code>. Fondamentalement un struct A * code>. Li>
MALLOC (STRUCTURE DE (STRUCTION A *) * N) CODE> ALLOCATES N CODE> NUMÉRO DE TYPE STRUCTION A * CODE> Éléments. Chaque élément peut alors indiquer des éléments de type struct A code>. Fondamentalement MALLOC (TAILLEOF (STRUCTION A *) * N) CODE> Alloue un tableau (N-ÉLÉMENTS) -OF-POINTERS-TO-TOYE- "STRUCTION A" CODE>. Et, l'emplacement de mémoire alloué peut être enregistré et accédé à l'aide d'un pointeur-to- (pointeur à «struct A») code>. Fondamentalement un struct A ** code>. Li>
ul> (N-ELS) -OF-Pointers-Pointers-to-Type- "Struct A" Code>, est-ce P>
struct A * code> au lieu de struct A ** code>? li>
alloué (N-ÉLÉMENTS) -OF -OP -OP -OP-POINTERS-DE TYPE- "STRUCTER A" CODE> UTILISANT POINTER-TO- "STRUCTION A" code>? li>
ol>
GCC code> drapeaux) Ce type de typon de programmation inattendu qui pourrait parfois fonctionner et pourrait souffler à tout moment! J'ai compilé ceci en utilisant -wall code> et trouvé aucun avertissement! p> p>
4 Réponses :
non. p>
tailleOf (struct A *) code> est la taille d'un pointeur em>.
Tailleof (Silth A) Code> est la taille de l'ensemble de la structure. P>
Merci pour votre réponse. Mais pourriez-vous s'il vous plaît élaborer pourquoi l'extrait de code ci-dessus fonctionne! .. cela n'est-il pas si supposé s'écraser?
@Sangeethsaravanaraj: Un comportement non défini ne signifie pas que le programme va toujours s'écraser, cela signifie simplement que le programme est mal formé et que vous ne pouvez pas définir le comportement de celui-ci.
@Sangeethsaravanaraj: comportement indéfini b> est ce qui est censé arriver.
Ce Dans votre cas, vous souhaitez que votre pointeur pointe sur Array = (DATA *) MALLOC (Tailleof (DATA *) * N) CODE> Alloue un Tailleof (Data *) Code> ( Pointeur Strong> ) To Struct DATA CODE>, si vous souhaitez le faire, vous avez besoin d'un tableau code> code> pour être un DATA ** Array code>. p>
Tailleof (données) code>, une structure en mémoire, pas sur un autre pointeur. Cela nécessiterait une donnée ** code> (pointeur sur pointeur). P>
est-il valide pour attribuer cela à la structure A * au lieu de la structure A **? P> blockQuote>
Eh bien, techniquement, il est valable de céder comme ça, mais c'est faux (UB) de la désarence de ce pointeur. Vous ne voulez pas faire cela. P>
valide pour accéder / référencer le tableau alloué (N-ÉLÉMENTS) -OP -OP -OP-POINTERS-"STRUCTION A" À L'UTILISATION DE POINTER-TO- "STRUCTION A"? P> blockQuote>
Non, comportement non défini. p>
Il est certainement sûr de lancer (ou d'attribuer directement) le résultat d'un appel à MALLOC () code> au type de pointeur "incorrect". MALLOC () CODE> n'a aucun concept de types, il suffit d'attribuer des séquences d'octets. Comportement non défini Les résultats ne résultent que d'écrire après la fin de la séquence des octets que vous avez posée MALLOC () code> pour vous donner.
Il semble y avoir un malentendu fondamental.
MALLOC (Tailleof (Silf A) * N) attribue n Nombre de types Struct A Eléments. P> BlockQuote>
Non, c'est juste ce que l'on l'utilise habituellement comme après un tel appel.
MALLOC (Taille) Code> Alloue une région de mémoire de la taillecode> octets. Ce que vous faites avec cette région est entièrement à vous. La seule chose qui compte, c'est que vous ne dépassez pas les limites de la mémoire allouée. En supposant 4 octetsfloat code> etint code> et 8 octetsdouble code>, après unmalloc (100 * de taille de taille de (flotteur)); code>, vous pouvez utiliser les 120 premiers des 400 octets sous forme de tableau de 15Double code> S, le 120 suivant en tant que tableau de 30float code> S, puis placez un tableau de 20Char code> S droite derrière cela et remplissez les 140 octets restants avec 35int code> s si vous le souhaitez. C'est un comportement défini parfaitement inoffensif. P>
MALLOC code> renvoie unVoid * code>, qui peut être implicitement couplé à un pointeur de n'importe quel type, de sorte que p>type *pointer = malloc(num_elems * sizeof(*pointer));
Votre titre de question ne semble pas correspondre aux questions réelles dans le reste de votre texte ci-dessus ...
En outre, pourquoi voudriez-vous affecter le résultat de
MALLOC code> à la mauvaise chose, puis de la déréence? Je ne comprends pas le principe des questions.@Olicharlesworth je le fais par erreur et non intentionnellement! Le programme n'est donc pas supposé cruser quand je le fais ?!
En ce qui concerne la modification: N'écrivez pas
array = malloc (taille de (données) * n) code>. Au lieu de cela, écrivezarray = malloc (taille de (* tableau) * n); code>. Cela n'aide pas le compilateur, mais il vous aide à affecter le type de bon type car vous n'avez pas à nommer le type, il vous suffit de vous rappeler de mettre un* code> avant le nom du pointeur vous vous assignez. Je ne pense pas qu'il y ait quelque chose dans GCC pour appliquer cela, mais si vous regardez autour de vous, vous trouverez un outil de style pelucheux qui appliquerait des règles de style autour de l'utilisation deMalloc Code>.@Sangeethsaravanaraj Votre code n'est pas correct, il fonctionne car la variable VAL est trop petite si elle était plus grande, elle échouera
@oussama je sais que ce code est faux et son insensé de faire cette mission de pointeur. Mais je cherchais une explication sur la raison pour laquelle cela pourrait fonctionner sans crash. Votre réponse semble être raisonnable .. c'est l'explication que je recherche! +1 pour votre réponse. Merci!