2015-03-30 3 views
1

В fgets(s, 10, fp), s - это адрес, с которого начинается чтение из файла «text.txt». Я прав?первый аргумент функции fgets

Если да, то как функция знает, где s указывает, когда это объявлено так? Я всегда думал, что s будет случайным свободным местом в памяти? Может кто-нибудь объяснить более подробно, почему этот код читается с начала «text.txt»?

Я новичок в C.

fp = fopen("text.txt", "r"); 
    if (fp != NULL) 
    { 
     char *s 
     printf("content of file:\n"); 
     while ((s = fgets(s, 10, fp) 
     { 
      printf("%s", s); 
     } 
     fclose(fp); 
    } 
+1

'Я правильно' нет, первый аргумент и указатель на массив, где читать символы будут сохранены, этот массив должно быть выделено уже –

ответ

2

s является местом для хранения байт, которые получают считанные из файла. (Это не «где в файле начать чтение», «где положить байты после их чтения»)

В этом случае вы не устанавливаете s на что-либо, так что вы не знаете, что это содержит. (Другими словами, он неинициализирован)

Значит, вы говорите fgets для хранения байтов, которые он читает в определенном месте, и вы не знаете, что это за местоположение. Возможно, это не выделенный адрес (который может вызвать segfault), может быть, это некоторая память, которую ничего не использует (в этом случае она работает), или, может быть, она указывает на что-то важное, что вы только что сказали fgets для перезаписи (в этом случае это работает, а затем падает позже, когда какой-то другой код пытается получить доступ к важной вещи). Невозможно узнать.

+0

Спасибо за быстрый ответ, мой профессор сказал нам неправильно о первом аргументе. –

4

Вы должны передать действительный указатель в качестве первой руки в fgets, и он должен указывать на объем памяти, по крайней мере такой же большой, как указано во втором аргументе.

Вы можете изменить

char *s 

в

char *s = malloc(10); 

или

char s[10]; 

код за fgets копирует данные из файла в память, что вы выделили.

3

Вы действительно читаете текст в случайном месте в памяти. Это может привести к сбою или успеху, или сделать что-то еще полностью. Когда вы пишете в память, которая не принадлежит вам, все ставки отключены.

Либо объявить s как это:

char s[10]; 

или выделить его:

s = malloc(10); 
+0

"чтение текста в случайном месте"? Мне нравится все это ... – Sebivor

Смежные вопросы