7
votes

Sont "MALLOC (taille de (struct A *))" et "malloc (taille de (structure a))" la même chose?

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 ?!

Voici une compréhension de base sur l'attribution de Mémoire Utilisation de MALLOC () WRT Structures et Pointants

  • MALLOC (Tailleof (Silf A) * N) Allocates N Nombre de type struct A éléments. Et, cet emplacement de mémoire peut être stocké et accédé à l'aide d'un pointeur-à-type- "struct A" . Fondamentalement un struct A * .
  • MALLOC (STRUCTURE DE (STRUCTION A *) * N) ALLOCATES N NUMÉRO DE TYPE STRUCTION A * Éléments. Chaque élément peut alors indiquer des éléments de type struct A . Fondamentalement MALLOC (TAILLEOF (STRUCTION A *) * N) Alloue un tableau (N-ÉLÉMENTS) -OF-POINTERS-TO-TOYE- "STRUCTION A" . Et, l'emplacement de mémoire alloué peut être enregistré et accédé à l'aide d'un pointeur-to- (pointeur à «struct A») . Fondamentalement un struct A ** .

    Ainsi, lorsque nous créons un tableau (N-ELS) -OF-Pointers-Pointers-to-Type- "Struct A" , est-ce

    1. valide pour assigner que à struct A * au lieu de struct A ** ?
    2. Valid to Access / Dés-Référifiez le tableau alloué (N-ÉLÉMENTS) -OF -OP -OP -OP-POINTERS-DE TYPE- "STRUCTER A" UTILISANT POINTER-TO- "STRUCTION A" ?

      xxx

      Le code de code est comme suit: xxx


      éditer: Ok dis dire si je fais ce qui suit par erreur xxx

      est un moyen de capturer (pendant la compilation en utilisant Tout GCC drapeaux) Ce type de typon de programmation inattendu qui pourrait parfois fonctionner et pourrait souffler à tout moment! J'ai compilé ceci en utilisant -wall et trouvé aucun avertissement!


6 commentaires

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 à 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) . Au lieu de cela, écrivez array = malloc (taille de (* tableau) * n); . 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 * 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 de Malloc .


@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!


4 Réponses :


7
votes

non.

tailleOf (struct A *) est la taille d'un pointeur .
Tailleof (Silth A) est la taille de l'ensemble de la structure.


3 commentaires

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 est ce qui est censé arriver.



1
votes

Ce Array = (DATA *) MALLOC (Tailleof (DATA *) * N) Alloue un Tailleof (Data *) ( Pointeur ) To Struct DATA , si vous souhaitez le faire, vous avez besoin d'un tableau pour être un DATA ** Array .

Dans votre cas, vous souhaitez que votre pointeur pointe sur Tailleof (données) , une structure en mémoire, pas sur un autre pointeur. Cela nécessiterait une donnée ** (pointeur sur pointeur).


0 commentaires

1
votes

est-il valide pour attribuer cela à la structure A * au lieu de la structure A **?

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.

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

Non, comportement non défini.


1 commentaires

Il est certainement sûr de lancer (ou d'attribuer directement) le résultat d'un appel à MALLOC () au type de pointeur "incorrect". MALLOC () 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 () pour vous donner.



7
votes

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 taille code> 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 octets float code> et int code> et 8 octets double code>, après un malloc (100 * de taille de taille de (flotteur)); code>, vous pouvez utiliser les 120 premiers des 400 octets sous forme de tableau de 15 Double code> S, le 120 suivant en tant que tableau de 30 float code> S, puis placez un tableau de 20 Char code> S droite derrière cela et remplissez les 140 octets restants avec 35 int code> s si vous le souhaitez. C'est un comportement défini parfaitement inoffensif. P>

MALLOC code> renvoie un Void * code>, qui peut être implicitement couplé à un pointeur de n'importe quel type, de sorte que p>

type *pointer = malloc(num_elems * sizeof(*pointer));


0 commentaires