Retourne une chaîne à partir d'une fonction en C
J'ai une fonction c que je veux renvoyer une chaîne de caractères.
Si j'imprime la chaîne avant de la restituer ensuite je vois croc_data_0186.idx
Si j'essaie et imprimer le chaîne retournée puis je vois croc_data_á☼
N'importe qui peut voir ce que je fais de mal?
Problème de la fonction:
char* getSegmentFileName(FILE *file, int lineLength, int lineNumber)
{
char* fileNameString;
fseek(file, lineNumber * lineLength, SEEK_SET);
char line[lineLength];
fgets(line, lineLength, file);
char *lineElements[3];
lineElements[0] = strtok(line, ":");
lineElements[1] = strtok(NULL, ":");
lineElements[2] = strtok(NULL, ":");
fileNameString = lineElements[2];
printf ("getSegmentFileName fileNameString is: %s \r\n", fileNameString);
return fileNameString;
}
Code d'appel:
int indexSearch(FILE *file, char* value, int low, int high, char* segmentFileName)
{
...
segmentFileName = getSegmentFileName(file, lineLength, mid);
printf ("indexSearch: segmentFilename3 is: %s \r\n", segmentFileName);
...
}
double possible de fonctions retournant char pointeur
Double Possible de Retour C chaîne de caractères à partir d'une fonction
Double Possible de Retour C chaîne de caractères à partir d'une fonction
OriginalL'auteur Dunc | 2012-02-21
Vous devez vous connecter pour publier un commentaire.
Vous retourner un pointeur vers les données locales, ce qui n'est pas valide d'après la fonction retourne. Vous devez allouer de la chaîne correctement.
Cela peut être fait soit dans la fonction appelante, par la fourniture d'un tampon à la fonction appelée, et elle copie la chaîne de caractères sur le tampon. Comme ceci:
et la
getSegmentFileName
fonction:L'autre solution est d'allouer de la mémoire pour la chaîne dans
getSegmentFileName
:mais vous devez vous rappeler de
free
la chaîne plus tard.OriginalL'auteur Some programmer dude
C'est parce que vous retournant un pointeur local. C'est un comportement indéfini.
strtok
retourne un pointeur dans leline
tableau de caractères. Vous placez le pointeur dansfileNameString
, et de retour à l'appelant. À cette époque, la mémoire à l'intérieur deline
devient invalide: tous les déchets peuvent être écrits en elle.Pour éviter ce problème, vous devez passer un tampon/longueur paire pour la valeur de retour, ou de l'utilisation
strdup()
sur la chaîne que vous êtes de retour. Dans ce dernier cas, vous ne devez pas oublier de libérer la mémoire allouée pour la chaîne renvoyée parstrdup()
.Sur un sujet connexe, vous devriez éviter d'utiliser des
strtok
, car il n'est pas ré-entrant, et l'origine de problèmes dans des environnements multithreads. Pensez à utiliserstrtok_r
à la place."un tampon/longueur paire pour la valeur de retour" - ce qui est particulièrement simple dans ce cas, comme un tampon de taille
lineLength
est assez grand. C'est plus délicat lorsque l'appelant ne sais pas une bonne limite supérieure à l'avance.OriginalL'auteur dasblinkenlight
Vous retourner un pointeur sur une variable locale qui n'existe plus lorsque la fonction retourne. Vous devez
malloc
de stockage et de retour que. Sinon, vous pouvez laisser l'appelant passer une mémoire tampon pour être rempli. En tout cas, l'appelant est responsable defree
ing la mémoire plus tard.free
quemalloc
ed de mémoire plus tard aussi.OriginalL'auteur Daniel Fischer
C'est parce que vous le retour des pointeurs invalides.
est un pointeur.
vie sur la pile et est rempli avec un
fgets()
appel.Ici vous stocker des pointeurs dans ce tableau. L'un d'eux est
qui vous
par la suite.
La solution serait de
soit malloc suffisamment d'espace à l'intérieur de la fonction et de la copie de votre chaîne pour le nouveau bloc de mémoire ou
demander à l'appelant de fournir un tampon d'écrire les données.
OriginalL'auteur glglgl
Le problème, c'est que vous êtes de retour d'une pile variable, perdu lors de la fonction retourne. Une façon de faire cela est d'utiliser un char * arg en paramètre de la fonction, avec suffisamment d'espace réservé, et l'utiliser pour stocker toutes les informations et la renvoie.
OriginalL'auteur Tio Pepe
Ligne est une variable locale et est retiré à la fin de la fonction.
Vous devez utiliser la fonction malloc, ou strcpy à un pointeur de chaîne passée en argument.
OriginalL'auteur Michel Keijzers
Il y a 3 façons de résoudre ce
1) Faire 'fileNameString statique
2) l'Appelant de la fonction "getSegmentFileName' doit passer un tampon de caractères 'segmentFileName" pour le destinataire de l'appel c'est à dire
Dans ce cas, vous devez modifier les arguments de la fonction
3) De cette manière, vous pouvez allouer dynamiquement de la mémoire pour la fileNameString. Dynamique de la mémoire est allouée dans le tas et il ne sera pas perdue lorsque la fonction retourne. De sorte que vous pouvez l'utiliser en toute sécurité dans le indexSearch fonction.
Dans ce cas, vous aurez besoin de libérer de la mémoire pointée par fileNameString à l'aide de
free
OriginalL'auteur snibu