Ошибка сегментации-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) ;
Это не приведет к ошибке ошибки сегментации, поскольку вы больше не будете ссылаться на неизвестное местоположение