2009-08-14 6 views
0

Le fragment de code suivant se termine par une exception lors de l'exécution de la fonction strncpy:Exception lors de l'utilisation strncpy

#define MAX_FILENAME_LEN 127 

typedef struct { 
unsigned long nameLength; 
char name[MAX_FILENAME_LEN + 1]; 
} filestructure; 

char *fileName; 

strncpy(fileName, filestructure->name, MAX_FILENAME_LEN); 
*(fileName + MAX_FILENAME_LEN+1) = 0; 

Ayone une idée de ce qui pourrait mal tourner? Dans la structure des fichiers, j'ai un nom de fichier qui est de 50 caractères, donc il est dans les limites ... Je suis vraiment un peu perdu ce qui pourrait causer le problème dans ce code simple ...

+2

Utilisez std :: string sauf si vous avez vraiment une bonne raison. –

+1

"Une exception"? Vous utilisez une fonction C et C n'a pas d'exceptions. Dans tous les cas, lorsque vous posez des questions sur les erreurs que vous rencontrez, il est parfois utile * de décrire l'erreur *. * Quelle * exception avez-vous eu? – jalf

+0

@jalf: C'est probablement une exception au système d'exploitation, probablement une violation d'accès. – sbi

Répondre

5

Vous n'avez pas d'espace alloué pour le tampon de destination et fileName n'est pas initialisé. Donc, vous essayez de copier quelque part. Vous devriez allouer de la mémoire et ensuite la libérer.

char *fileName = new char[MAX_FILENAME_LEN + 1]; 
strncpy(...); 
*(...) = 0; 
doStuffWithTheBuffer(fileName); 
delete[] fileName;// free memory 

Aussi, si vous avez un tampon de taille N + 1 et que vous voulez copier N octets maximum et nul fin à la mémoire tampon vous devez faire

*(buffer + N) = 0; 
0

Vous avez pas d'espace alloué pour le nom de fichier. Soit faire

filename = malloc (MAX_FILENAME_LEN * sizeof(char)); 

ou

filename = strndup (filestructure->name, MAX_FILENAME_LEN); 
+0

malloc ?? dans une application C++. s'il vous plaît utilisez juste nouveau – Glen

1

Votre question est étiqueté C++ mais le code est pur C. Pourquoi faites-vous à la dure? Le fait que la gestion des chaînes de caractères ne soit pas si facile à saisir (et qu'il ne soit pas si rare de se tromper de temps en temps même pour les programmeurs qui en ont une bonne compréhension) est la raison même pour laquelle C++ vous laisse faire sans.

Si vous écrivez en C++, faites-le en C++. Utilisez std::string. Honnêtement, cela vous épargnera de nombreuses heures de débogage d'un tel code.

Questions connexes