6
votes

C Global Invisa Tabley?

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: xxx

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: xxx

il a utilisé (i aussi testé avec) Turbo C v1. Je l'ai essayé sous Linux et ça marche aussi.

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.


3 commentaires

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.


3 Réponses :


7
votes
int array[1];

3 commentaires

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] 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 []; == int gray [1]; Donnez-moi le lien lire..



4
votes

Ceci est comportement indéfini . Vous écrivez à la mémoire non allouée (au-delà du tableau). Afin de compiler cela, le compilateur attribue au moins un élément et vous écrivez ensuite au-delà de cela. Essayez une gamme beaucoup plus grande de chiffres. Par exemple, si j'exécute votre code sur Linux, cela fonctionne, mais si je change la boucle à 50 000, il se bloque.

edit Le code peut fonctionner pour de petites valeurs de n mais pour des valeurs plus importantes, elle échouera. Pour démontrer cela, j'ai écrit votre code et l'avez testé pour n = 1000 .

Voici le lien pour codépade , et vous pouvez voir que pour n = 1000, une faute de segmentation arrive.

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é comportement non défini .


1 commentaires

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



1
votes

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!!!");
}


0 commentaires