2013-11-25 3 views
3

У меня есть простой вопрос об использовании fgets() с char * string.Использование fgets() с char * type

.... 
char *temp; 
FILE fp=fopen("test.txt", "r"); 

fgets(temp, 500, fp); 
printf("%s", temp); 
.... 

Этот код не работает.

Но после того, как я модифицировал char *temp на char temp[100];, код работал хорошо, как я и предполагал.

В чем разница между этими двумя?

Когда я гугле это, некоторые говорили, что память должна быть распределена char * с помощью таНос() ...

Но я не мог понять.

+1

Если не выделять память на что будет указывать указатель? Чтобы помнить об этом, сразу назначьте NULL указателю после объявления. Это слово сохраняется, когда вы освобождаете память указателя. Добавьте NULL туда после удаления. Указатель на выделенную память не является очень распространенной ошибкой и дает вам ужасную ошибку сегментации. –

ответ

2

char *temp неинициализирован, то есть не указывает на действительную память. Либо сделайте массив (char temp[]), либо используйте malloc для назначения памяти для него.

+0

Большое спасибо. :) – user3033077

5

char * temp - это только указатель. Вначале это не указывает ни на что, возможно, оно имеет случайное значение.

fgets() читает 500 байт от fp до адреса памяти, где указан этот указатель темпа! Таким образом, он может перезаписывать вещи, он может создавать сбои сегментации, и только с очень низкой вероятностью обычно будет работать релятивизация.

Но char temp [500] - это массив длиной 500 байт. Это означает, что компилятор выполняет выделение в начале вашего процесса (или при вызове вашей функции). Таким образом, эти 500 байтов будут полезными 500 байтами, но у него есть цена: вы не можете перераспределять, изменять размер, бесплатно и т. Д.

Что Google хочет от вас, это:

char *temp = (char*)malloc(500); 

И

free(temp); 

после этого не нужно больше.

+1

В C нет необходимости приводить результаты 'malloc/calloc/realloc' и не рекомендуется: http://stackoverflow.com/a/605858/694576 – alk

+0

Пока я не сделал это, чтобы избежать gcc-предупреждений , но его аргументы сильны. – peterh

+0

Большое спасибо. :) – user3033077

2

Когда мы пишем

char *temp ; 

это означает temp неинициализированного указатель char т.е. в настоящее время она не содержит какой-либо адрес в нем.

При использовании fgets вам необходимо передать строку, в которой должны быть скопированы байты, считанные с указателя файла. link с temp не инициализирован, то fgets выглядит эта

fgets(<no string> , 500 , fp) ; 

который является недействительным.

Следовательно, мы должны дать инициализированную строку, которая может быть сформирована как:

1) char *temp = malloc(sizeof(500)) ; 
or 
2) char temp[500] ; 

Следовательно, если мы передаем инициализируется строку fgets, это будет выглядеть как

fgets(< some string > , 500 , fp) ; 
+0

oh..yes, извините. – Subbu

+0

Большое спасибо. :) – user3033077

+0

Это переполнение буфера. 'malloc (sizeof (500))' будет выделять около 4 байтов, а не 500. – Bilow

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