2017-08-01 4 views
1

J'ai essayé différentes permutations de ce type de boucle.Comment copier * char vers un tableau statique de chaînes, printf produisant une sortie étrange,

char hrstdesc[50][50]; 
char hrstread[50][50]; 
int i = 0; 

for (hfree = hentry; hfree; hfree = hfree->prev) { 
    if (filterentry(hfree)) { 
     continue; 
    } 

    strcpy(&hrstdesc[i][0], hfree->hrstdesc); 
    printf("%s \n", hrstdesc[i]); 
    i++; 
} 
printf("%s \n", hrstdesc[1]); 

La sortie est,

/run/media/username/archive 
/home 
/var 
/
/ho/va/ 

Les 4 premières lignes viennent, printf("%s \n", srtdesc);, et sont ce que je pense.

La dernière ligne, je m'attendrais à voir /home, mais à la place je reçois /ho/va/.

https://github.com/techzilla/check_snmp_extras/blob/master/src/check_snmp_disks.c

+2

pour (hentry = hentry;) ??? –

+0

'hentry = hentry' pourquoi voudriez-vous même faire cela? – babon

+0

@babon, corrigez-moi s'il vous plaît, j'apprécierais énormément. Je pensais juste que c'est ce que tu étais supposé faire en bouclant cette structure. Je suis très intéressé par une meilleure pratique. J'ai vu certaines personnes créer une variable temporaire, pour exécuter une telle boucle, mais je ne savais pas pourquoi. un peu comme, 'pour (hfree = hentry; hfree; hfree = hfree-> prev) {' – TechZilla

Répondre

1

Dans le fichier lié, vous définissez hrstdesc [] [] comme hrstdesc [max_entries] [max_entries] (non [50] [50]). MAX_ENTRIES est # défini comme 3 dans l'en-tête check_snmp_extras.h disponible dans le même référentiel. Le comportement bizarre est dû à un dépassement de hrstdesc [] [] à chaque itération de la boucle. Votre hrstdesc [1] final est les 3 premiers caractères de l'itération de boucle 1 (/ home), suivi des 3 premiers caractères de l'itération de boucle 2 (/ var), suivi du caractère d'une boucle de l'itération 3 (/).

+0

Je suis surpris que vous n'ayez pas eu une sorte de faute de segmentation ou de vidage du noyau, etc en raison de la mémoire corrompue ... – lyst