0
votes

La déclaration de matrice 2D de taille variable est-elle incorrecte?

voici MAIN.C:

[root@localhost test]# ./test 3
before:(nil), after:(nil), sizeof val:24
int_array:0x7ffeadc69470, int_array[0]:0x7ffeadc69470, int_array[1]:0x7ffeadc69498, int_array[2]:0x7ffeadc694c0, int_array[3]:0x7ffeadc694e8
val:0x7ffeadc69440, val[0]:0x7ffeadc69470, val[1]:0x7ffeadc694e8, val[2]:0x3, val[3]:0x4005ba
before:(nil), after:(nil)

[root@localhost test]# ./test 6
before:(nil), after:(nil), sizeof val:48
int_array:0x7ffcd30f1f50, int_array[0]:0x7ffcd30f1f50, int_array[1]:0x7ffcd30f1f78, int_array[2]:0x7ffcd30f1fa0, int_array[3]:0x7ffcd30f1fc8
val:0x7ffcd30f1f00, val[0]:0x7ffcd30f1f50, val[1]:0x7ffcd30f1fc8, val[2]:0x7ffcd30f2220, val[3]:(nil)
before:(nil), after:(nil)


3 commentaires

"Ce n'est pas l'heure de la compilation, mais le temps d'exécution quand Tailleof () est déterminé?" Normalement, il est à la compilation, mais pour les VLAS, il doit les déterminer au moment de l'exécution. Notez que les VLAS ne font pas partie de C ++ et cela ne fonctionne que sur les compilateurs qui les tolèrent néanmoins.


Comme il s'agit de code entièrement C (y compris l'extension du nom de fichier), il doit être étiqueté C et non C ++.


"La déclaration de graphique 2D de taille variable est-elle incorrecte?" ---> Il n'y a pas de tableau 2D de taille variable dans le code.


3 Réponses :


8
votes

est la déclaration de graphique 2D de taille variable incorrecte?

en C ++, la taille de toutes les variables de réseau doit être une constante de temps de compilation. Taille n'est pas une constante de temps de compilation, et donc int * val [taille]; est mal formé en C ++.


0 commentaires

0
votes

pour VLAS, oui, le résultat de taille de est calculé à l'exécution:

6.5.3.4 le taille de et _ALignof opérateurs

...
2 le taille de donne la taille (en octets) de son opérande, qui peut être un expression ou le nom de parenthèse d'un type. La taille est déterminée à partir du type de l'opérande. Le résultat est un entier. si le type de l'opérande est un tableau de longueur variable type, l'opérande est évalué; sinon, l'opérande n'est pas évalué et le résultat est un Entier constant.

C 2011 en ligne Projet

emphase ajoutée.

Cela a du sens, puisque la taille d'une VLA n'est pas établie tant que le temps d'exécution.

Je ne sais pas ce que vous essayez d'accomplir avec avant et après - si vous essayez de voir quelles adresses val Prends, ce n'est pas le moyen de le faire. Tout d'abord, vous voudriez imprimer les valeurs de et avant et et après , mais même il n'y a aucune garantie que les objets sont aménagés dans la mémoire dans le même ordre qu'ils ont été déclarés. Il n'est pas non plus garanti que les VLAS sont attribuées à partir de la même région de mémoire que les autres variables (elles sont généralement, mais ce n'est pas nécessaire).


0 commentaires

0
votes

Merci John and Blaze, et oui, c'est Vals (longueur de la variable), qui est pris en charge par GNU C compilateur (GCC) comme extension depuis C99. Donc, beaucoup de choses dépendent du compilateur.

Voici plus à apprendre, trouvé à Wikipedia:
Allocation

  • Le compilateur GNU C attribue la mémoire pour VLAS avec stockage automatique Durée sur la pile. [4] VLAS, comme tous les objets en C, sont limités à Taille_max octets. [5]
  • VLAS peut également être attribué sur le tas et accessible à l'aide d'un pointeur à VLA.

0 commentaires