Почему код C дает segfault? - PullRequest
1 голос
/ 26 января 2012

Я просто хочу знать, почему этот кусок кода дает мне ошибку.

if(argc < 2){
    printf("\n Please mention the file name");
    exit(1);
}
FILE* fp;
if((fp = fopen(argv[1],"r")) == NULL){
    printf("\n can't open file");
    exit(1);
}
char* str;
fgets(str,80,fp);
printf("\n this is the output %s",str);

Если я объявлю str как char str [100], то он будет работать нормально.

Ответы [ 3 ]

3 голосов
/ 26 января 2012

Вы не выделяете память; вы просто объявляете char *. Либо char str[100] будет работать, либо:

char *str = malloc(100);

Это выделит память для вашей строки. В противном случае вы просто читаете из fgets() в не принадлежащую вам память и вызываете ошибку сегментации.

Если вы сделаете это, обязательно позвоните на free() после того, как вы закончите с ним.

2 голосов
/ 26 января 2012

char* str - неинициализированный указатель.fgets записывает в память, указанную этим указателем, которая может находиться где угодно.Объявление фактического хранилища с str[100] обеспечивает 100 байтов действительной памяти для записи.

0 голосов
/ 26 января 2012

char* str; объявляет указатель на символ, но не оставляет места для самих символов. Кроме того, поскольку вы не инициализировали его, он указывает на какое-то случайное место в памяти.

Затем fgets(str, 80, fp) говорит, что нужно взять 80 символов из файла и сохранить их, начиная с указанного места. Поскольку (скорее всего) вашей программе не принадлежит это местоположение, вы получаете ошибку по умолчанию.

char str[100]; резервирует место для 100 символов в стеке в виде массива, и вы можете использовать str в качестве указателя на начало этого массива. Ваша программа может делать с этой памятью все, что захочет, поэтому при выполнении команды fgets не возникает никаких ошибок. Обратите внимание, что если ваш массив слишком короткий, то у вас все еще могут быть проблемы, хотя они не обязательно являются ошибками сегмента.

...