Динамический массив с malloc не работает, но фиксированный размер работает - C

Почему фиксированный массив работает, но когда я пытаюсь сделать его динамическим с помощью malloc, возникает ошибка сегментации? Я пробовал все виды значений, кроме *10. Это просто использование небольшого файла. Мне нужно это для работы со словарем из 90 000 слов.

FILE *fp;
long lSize;
//char buffer[100];
char *buffer=malloc(sizeof(char)*10);
int i = 0;

fp = fopen ( "cats.txt" , "rb" );
if( !fp ) perror("cats.txt"),exit(1);

wordTree = makeEmptyTree();

while( fscanf(fp, "%s", &buffer) != EOF )
{
    addStringToTree(wordTree, buffer);
    //printf("%s\n", words[i]);
}

fclose(fp);
//free(buffer);

Я также могу включить addStringToTree, если это необходимо.

Изменить 1

Спасибо, ребята, что исправили. К сожалению, я не смог заставить работать текстовый файл из 90 000 слов, но все еще получаю ошибку ошибки сегмента.


person StefanBob    schedule 11.04.2014    source источник
comment
По поводу редактирования. Сделайте буфер достаточно большим. Если проблема не устранена, убедитесь, что с wordTree все в порядке. Попробуйте использовать отладчик, например gdb.   -  person Rikayan Bandyopadhyay    schedule 11.04.2014


Ответы (4)


Изменять

char *buffer=malloc(sizeof(char)*10);

to

char *buffer=malloc(100);

а также

while( fscanf(fp, "%s", &buffer) != EOF )

to

while( fscanf(fp, "%s", buffer) != EOF )

затем повторите попытку.

  1. sizeof(char) всегда возвращает 1, а размер buffer должен быть 100 (потому что в статическом случае это 100);
  2. buffer уже указатель на char, & раньше не надо и даст адрес указателя вместо адреса, на который указывает buffer. (И это, вероятно, причина ошибки сегмента.)
person Lee Duhem    schedule 11.04.2014

Так должно быть

fscanf(fp, "%s", buffer) //remove the ampersand
person Rikayan Bandyopadhyay    schedule 11.04.2014

Вы передаете указатель на указатель в fscanf. Просто есть буфер в fscanf. В случае 'char buffer[]' &buffer и buffer эквивалентны. Следовательно, в этом случае нет seg-fault.

person Prabhu    schedule 11.04.2014
comment
Они не эквивалентны, но в общих реализациях это все равно работает. - person M.M; 11.04.2014

Обратите внимание, что типы вашего фиксированного массива и динамически выделяемого массива различны:

char buffer[100];

vs.

char* buffer 

Malloc возвращает расположение адреса вашей динамически выделенной памяти, поэтому вам не нужно добавлять к нему префикс «&». Так что просто используйте это:

while( fscanf(fp, "%s", buffer) != EOF )
{
    .....
person DryingPole    schedule 11.04.2014