Ошибка сегментации-C [дубликат]

этот вопрос уже есть ответ здесь:

почему следующий код возвращается с ошибкой сегментации? Когда я комментирую строку 7, ошибка seg исчезает.

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)] = '';
      puts(dyn_s);
      return 0;
    }

Ура!

5 ответов


s неинициализированный указатель; вы пишете в случайное место в памяти. Это вызовет неопределено поведение.

вам нужно выделить некоторую память для s. Кроме того,никогда не используйте gets; нет никакого способа предотвратить переполнение памяти, которую вы выделяете. Использовать .


катастрофически плохо:

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)] = '';
      puts(dyn_s);
      return 0;
    }

лучше:

#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)] = '';
      puts(dyn_s);
      return 0;
    }

лучше:

#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;
    }

код scanf("%s", s); закомментирован. Это означает, что s неинициализирован, поэтому, когда эта строка ln = strlen(s); выполняется, вы получаете ошибку seg.

это всегда помогает инициализировать указатель на NULL, а затем проверить значение null перед использованием указателя.


еще лучше

#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;
}

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) ;

Это не приведет к ошибке ошибки сегментации, поскольку вы больше не будете ссылаться на неизвестное местоположение