Nous avions un projet scolaire, tout système d'information utilisant C. Pour conserver une liste de documents dynamiques des archives de l'étudiant, je suis allé pour une structure de données de liste liée. Ce matin, mon ami m'a laissé voir son système. J'ai été surpris de sa liste d'enregistrements: comme avec le code, il a déclaré un tableau non défini qui est global (dans le segment BSS) à l'ensemble du programme. Il a pu ajouter de nouvelles entrées à la matrice en écrasant des blocs de mémoire ultérieurs avec une valeur autre que zéro de sorte qu'il puisse traverser le tableau ainsi: p> il a utilisé (i aussi testé avec) Turbo C v1. Je l'ai essayé sous Linux et ça marche aussi. P> Comme je n'ai jamais rencontré cette technique auparavant, je suppose qu'il y a un problème avec cela. Alors, oui, je veux savoir pourquoi c'est une mauvaise idée et pourquoi la préfèrent-elle sur une liste liée. P> p>
3 Réponses :
int array[1];
N'est-ce pas juste une ub, car GCC dit Source.c: 4: 5: AVERTISSEMENT: le tableau 'Array' supposé avoir un élément [activé par défaut] code> qui signifierait qu'il voudrait écrire en dehors de la limites de la matrice aller plus loin que 1 élément?
Ce n'est pas un VLA, il suffit d'écrire à une adresse aléatoire en mémoire.
Salut est-ce vraiment int gray []; code>
== code>
int gray [1]; code> B> Donnez-moi le lien lire..
Ceci est edit strong> Le code peut fonctionner pour de petites valeurs de Voici le lien pour codépade strong> , et vous pouvez voir que pour n = 1000, une faute de segmentation alors que avec le même code avec le même compilateur, il fonctionne pour N = 10, voir ce lien CodePad . C'est donc appelé n code> mais pour des valeurs plus importantes, elle échouera. Pour démontrer cela, j'ai écrit votre code et l'avez testé pour
n = 1000 code>. P>
J'ajoute plus de détails dans votre réponse pour démontrer un comportement non défini pour le code. J'espère que vous aimez. Sinon, vous pouvez revenir à votre version
Si vous utilisez des listes liées, vous pouvez vérifier si la mémoire est attribuée correctement ou non.
int *ptr; ptr = (int *)malloc(sizeof(int)) if(ptr==NULL) { printf("No Memory!!!"); }
C'est la même chose que l'écriture à tout réseau hors limites - non définie.
Est-ce censé être C99?
1er Veuillez vérifier la réponse de la mise à jour de Teppic. et ouvrez le lien CODEPAD Vous pouvez observer le comportement non défini de C dans votre code.