Pourquoi le code suivant renvoie-t-il avec une erreur de segmentation? Lorsque je commente la ligne 7, le défaut séparé disparaît.
int main(void){
char *s;
int ln;
puts("Enter String");
// scanf("%s", s);
gets(s);
ln = strlen(s); // remove this line to end seg fault
char *dyn_s = (char*) malloc (strlen(s)+1); //strlen(s) is used here as well but doesn't change outcome
dyn_s = s;
dyn_s[strlen(s)] = '\0';
puts(dyn_s);
return 0;
}
À votre santé!
s
est un pointeur non initialisé; vous écrivez dans un emplacement aléatoire de la mémoire. Ceci invoquera le comportement non défini.
Vous devez allouer de la mémoire pour s
. De plus, n'utilisez jamais gets
; il n'y a aucun moyen de l'empêcher de saturer la mémoire que vous allouez. Utilisez fgets
à la place.
Catastrophiquement mauvais:
int main(void){
char *s;
int ln;
puts("Enter String");
// scanf("%s", s);
gets(s);
ln = strlen(s); // remove this line to end seg fault
char *dyn_s = (char*) malloc (strlen(s)+1); //strlen(s) is used here as well but doesn't change outcome
dyn_s = s;
dyn_s[strlen(s)] = '\0';
puts(dyn_s);
return 0;
}
Meilleur:
#include <stdio.h>
#define BUF_SIZE 80
int
main(int argc, char *argv[])
{
char s[BUF_SIZE];
int ln;
puts("Enter String");
// scanf("%s", s);
gets(s);
ln = strlen(s); // remove this line to end seg fault
char *dyn_s = (char*) malloc (strlen(s)+1); //strlen(s) is used here as well but doesn't change outcome
dyn_s = s;
dyn_s[strlen(s)] = '\0';
puts(dyn_s);
return 0;
}
Meilleur:
#include <stdio.h>
#define BUF_SIZE 80
int
main(int argc, char *argv[])
{
char s[BUF_SIZE];
int ln;
puts("Enter String");
fgets(s, BUF_SIZE, stdin); // Use fgets (our "cin"): NEVER "gets()"
int ln = strlen(s);
char *dyn_s = (char*) malloc (ln+1);
strcpy (dyn_s, s);
puts(dyn_s);
return 0;
}
Votre scanf("%s", s);
est commenté. Cela signifie que s est non initialisé. Ainsi, lorsque cette ligne ln = strlen(s);
est exécutée, vous obtenez une erreur de segmentation.
Il est toujours utile d’initialiser un pointeur sur NULL, puis de tester NULL avant d’utiliser le pointeur.
char *s does not have some memory allocated . You need to allocate it manually in your case . You can do it as follows
s = (char *)malloc(100) ;
Cela n'entraînera pas d'erreur de segmentation car vous ne ferez plus référence à un emplacement inconnu.
Encore mieux
#include <stdio.h>
int
main(void)
{
char *line = NULL;
size_t count;
char *dup_line;
getline(&line,&count, stdin);
dup_line=strdup(line);
puts(dup_line);
free(dup_line);
free(line);
return 0;
}