Ошибка сегментации в Ubuntu GCC
#include<stdio.h>
int main()
{
char *ch;
int n=10;
gets(ch);
puts(ch);
printf("%d\n",n);
}
#include<stdio.h>
int main()
{
char *ch;
int n=10;
gets(ch);
printf("%d\n",n);
puts(ch);
}
В первом случае ошибка сегментации возникает при print(n), а во втором - при put (ch). Ошибка не возникает, если print(n) также используется сразу после объявления n.
3 ответа
gets()
разыменовывает унитизированный указатель, вызывая неопределенное поведение.
Выделите память для ch
и не используйте gets()
поскольку нет никакого способа ограничить число читаемых символов, что означает возможность записи за пределы массива назначения.
Пример использования fgets()
:
char ch[128];
if (fgets(ch, 128, stdin))
{
}
Используйте fgets и выделите память для своего "буфера" (через malloc) для хранения заданной строки. В конце звоните бесплатно за указателем.
#include<stdio.h>
#include<stdlib.h>
int main(){
char * ch = (char*) malloc(sizeof(char)*10);
//or by using this: char ch[10];
int n=10;
gets(ch);
puts(ch);
printf("%d\n", n);
free(ch);
}