Allouer dynamiquement de la mémoire pour const char string à l'aide de malloc()
Je suis en train d'écrire un programme qui lit une valeur de un .fichier ini, puis passe la valeur à une fonction qui accepte un PCSTR (c'est à dire const char *). La fonction est getaddrinfo()
.
Donc, je veux écrire PCSTR ReadFromIni()
. Pour retourner une chaîne constante, j'ai l'intention d'allouer de la mémoire à l'aide de malloc()
et la coulée de la mémoire à une chaîne constante. Je vais être en mesure d'obtenir le nombre exact de caractères qui ont été lues à partir de la .fichier ini.
Est que la technique ok? Je ne sais pas vraiment quoi faire d'autre.
L'exemple suivant exécute correctement dans Visual Studio 2013, et affiche "bonjour" comme souhaité.
const char * m()
{
char * c = (char *)malloc(6 * sizeof(char));
c = "hello";
return (const char *)c;
}
int main(int argc, char * argv[])
{
const char * d = m();
std::cout << d; //use PCSTR
}
Pourquoi le C++ tag? Ressemble à du c.
Juste pour information "sizeof(char)" est par définition 1.
std::cout est le C++.
OriginalL'auteur paperduck | 2014-02-05
Vous devez vous connecter pour publier un commentaire.
La deuxième ligne est "horriblement" mauvais:
De l'affectation de la variable
c
deux fois, alors, évidemment, la première affectation n'a pas de sens.C'est comme l'écriture:
En plus de cela, vous "perdre" de l'adresse de la mémoire allouée, de sorte que vous ne serez pas en mesure de libérer plus tard.
Vous pouvez modifier cette fonction comme suit:
Gardez à l'esprit que celui qui appelle
char* p = m()
, devra également appelfree(p)
à un moment plus tard...sizeof("hello")
<=>strlen("hello") + 1
(éviterstrlen
appel & nécessité pour less
variable) => nemalloc(sizeof("hello"))
etstrcpy(c, "hello")
OP évidemment se méprend sur quelques concepts de base de la langue (au moins au moment où la question a été posté). J'ai voulu coller à l'original du code d'aussi près que possible, afin d'identifier les erreurs et d'éviter toute confusion. Merci.
yep, je suis d'accord, mon intention n'était pas de demander pour répondre à modifier 🙂 j'ai l'habitude d'être surpris par ce genre de petits "trucs" (détails de la langue), le commentaire était destiné à ces lecteurs curieux 😉
OriginalL'auteur barak manos
Est une façon de retourner un statique locale pointeur.
De cette façon, chaque fois que la prochaine fois
m()
est appelé,c
encore des points pour le bloc de mémoire alloué plus tôt. Vous pourriez réallouer de la mémoire à la demande, remplir à de nouveaux contenus, et de renvoyer l'adresse.OriginalL'auteur timrau
PAS. Ce n'est pas OK. Lorsque vous ne
la mémoire allouée par
malloc
perdu.Vous pouvez faire en tant que
c = strcpy(c, "hello");
Mise à jour de ma réponse.
Non,
c = "string"
attribue le l'adresse d'une chaîne en lecture seule à un pointeur de variable. Le mémoire précédent adresse attribuée à c a été perduOriginalL'auteur haccks