web-dev-qa-db-fra.com

Erreur de segmentation - C

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é!

10
ceod

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.

16

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;
    }
3
paulsm4

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.

1
octopusgrabbus
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.

1
Subbu

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;
}
1
KAction