L'allocation de chaîne avec malloc
Je suis nouveau dans la programmation en C et maintenant, je suis étudiant en chaînes.
Ma question est: si j'alloue une aide de la chaîne de malloc
(comme dans le code ci-dessous), est le caractère NULL automatiquement insérée à la fin de la chaîne?
Je trouve une réponse à une autre question, et il semble que le caractère NULL n'est pas automatiquement inclus.
Mais voici le problème: je sais que des fonctions comme strlen
ne fonctionne pas s'il n'y a pas que le caractère NUL, et dans ce code je l'utilise et il fonctionne. Donc, je pense qu'il y a \0
à la fin de ma chaîne, même si je n'écris pas n'importe où.
Quelle est la réponse?
Voici le code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv) {
char *stringa1;
int n;
int i;
printf("How many characters in the string? ");
scanf("%d", &n);
stringa1 = (char*) malloc(n*sizeof(char));
printf("Insert the string: ");
scanf("%s", stringa1);
free(stringa1);
return 0;
}
Votre code semble bien pour moi.
Pour répéter ce que @MichaelWalz dit, et pour pinailler, un pointeur peut être
Dans une version précédente, j'ai essayé et elle renvoie le nombre que j'ai mis dans le premier
Je ne vois pas de réel problème avec votre code, à l'exception de casting de la suite de malloc. Il n'a pas d'effets particulièrement négatifs ici, mais est considéré comme une mauvaise pratique et permet de cacher les erreurs.
Il n'y a pas de
scanf
met le NUL (non NULLE) à la fin de la chaîne. Essayez d'appeler strlen
juste avant free(stringa1)
.Pour répéter ce que @MichaelWalz dit, et pour pinailler, un pointeur peut être
NULL
et un caractère peut être NUL
.Dans une version précédente, j'ai essayé et elle renvoie le nombre que j'ai mis dans le premier
scanf()
.Je ne vois pas de réel problème avec votre code, à l'exception de casting de la suite de malloc. Il n'a pas d'effets particulièrement négatifs ici, mais est considéré comme une mauvaise pratique et permet de cacher les erreurs.
Il n'y a pas de
NULL
caractère. NULL
est une macro avec un null le pointeur constant, quelque chose de très différent. Et C n'a pas de type chaîne.
OriginalL'auteur FranzGoogle | 2017-01-24
Vous devez vous connecter pour publier un commentaire.
malloc()
renvoie unevoid*
pointeur vers un bloc de mémoire stockée dans le tas. L'allocation avecmalloc()
ne pas initialiser une chaîne quelconque de l'espace en attente d'être occupé.Pour ajouter un null-caractère de terminaison, soit vous devez le faire vous-même, ou l'utilisation d'une fonction commescanf()
, qui ajoute ce personnage pour vous. Cela dit, vous avez besoin d'allouer de l'espace pour cette\0
caractère à l'avance.Votre
malloc()
appel doit être plutôt ceci:Remarque: Vous n'avez pas besoin de jeter le retour de malloc. Pour plus d'informations, lire cette.
Une autre chose à remarquer est
sizeof(char)
est1
, donc en multipliant ce dans votremalloc()
appel n'est pas nécessaire.Vous devez également vérifier si
malloc()
retourneNULL
. Cela peut être fait comme ceci:Aussi, vous pouvez uniquement utiliser
strlen()
sur une chaîne se terminant par null, sinon cela finit par être comportement indéfini.Une fois
scanf()
est appelé, et lestringa1
contient certains caractères, vous pouvez appelerstrlen()
sur elle.En outre, la vérification de retour de
scanf()
est aussi une bonne idée. Vous pouvez le vérifier comme ceci:Votre code avec ces modifications:
if(scanf("%zu", &n) != 1) {
fonctionne... Désolé pour la question stupide: si j'insère une valeur différente de '1' il devrait revenir "entrée non Valide". Ou pas?Il retourne uniquement la saisie de données incorrectes si un nombre n'a pas été lu. Donc, fondamentalement, il fait que seul
1
nombre est lu enn
.scanf()
vérifie juste la façon dont beaucoup de valeurs ont été lus. Dans ce cas, vous souhaitez uniquement une valeur de lecture, de Sorte quescanf()
vérifie que. si vous saisissez quelque chose commec
, cela permettra de signaler une erreur, car un certain nombre n'a pas été lu. Si vous saisissez quelque chose comme5
, puisscanf
a été un succès.OriginalL'auteur RoadRunner
Pas.
malloc()
retourne d'un bloc de mémoire non initialisée.scanf()
insère l'octet nul ('\0'
) pour vous lorsque vous utilisez%s
spécificateur de format (en supposant quescanf()
réussi).De
man scanf()
:(l'emphase est mienne).
Par le chemin, vous devriez faire la vérification des erreurs pour
scanf()
etmalloc()
appels.Merci, mais je ne comprends pas quand vous parlez de la vérification des erreurs pour
scanf()
etmalloc()
...renvoie le nombre d'éléments analysés avec succès; sinon, il est tombé en panne.
malloc()
retourne NULL si il n'a pas pu allouer de la mémoire. Donc, ce que je disais était à vous de vérifier le code de retour de ces fonctions pour vérifier si ils ont échoué. Tels que:if (scanf("%d", &n) != 1) { /* failure */}
etstringa1 = (char*) malloc(n*sizeof(char)); if (stringa1 == NULL) { /* failure */}
etc.OK. Et comment puis-je le faire? Désolé, mais je suis un débutant... puis-je le vérifier avec un
strlen()
?Voir la fin de mon commentaire précédent sur la façon de le faire. Vous ne savez pas comment
strlen()
est pertinent.strlen()
retourne simplement la longueur de la chaîne (etstrlen()
il faut un octet null terminated string en entrée). Donc, simalloc()
pas alors vous ne pouvez pas appelerstrlen()
surstringa1
. Vous devez juste vérifier chaque fonction de son échec.OriginalL'auteur P.P.
La définition de la "chaîne" C est une séquence de caractères terminée par un caractère nul.
D'allouer de la mémoire pour une chaîne de caractères, le comte de la chracters (par exemple
strlen
) et ajouter 1 pour ce caractère de fin null.Fonctions comme
scanf
etstrcpy
ajouter le caractère null; une fonction commestrncpy
n'est pas toujours le faire.OriginalL'auteur Paul Ogilvie
malloc
renvoie un pointeur vers une mémoire non initialisée mesure.Si vous voulez que la mémoire mesure serait initialisé par des zéros, alors vous pouvez utiliser une autre fonction standard
calloc
au lieu demalloc
.Prendre en compte généralement que ces une question comme ça
implique que la terminaison zéro n'est pas compté. Donc, vous devez allouer un octet de plus de mémoire. Par exemple
ou
Dans le dernier cas, vous pouvez appliquer la fonction
strlen
qui renvoie 0 car la mémoire mesure est initialisé à zéro.Cet appel de
scanf
est dangereux. Il est préférable d'utiliser
fgets
à la place. Par exempleCette fonction peut ajouter la chaîne avec le caractère de nouvelle ligne. Pour la retirer de la chaîne, vous pouvez écrire
OriginalL'auteur Vlad from Moscow