Массив строк, перезаписывающих друг друга? - PullRequest
0 голосов
/ 20 октября 2010

Я делаю функцию, которая превращает список слов в массив для использования другими функциями, но каким-то образом я перезаписываю предыдущие слова. Я проверяю адрес памяти », и они кажутся разными, но когда я проверяю, как только я закончу импортировать слова, они все одинаковы.

static char **array;

//takes the name of a data file and reads it into an array
static void InitDictionary(char *fileName){
  //slide 36, chap 3
  FILE *file;
  int count,i;
  char dummy[30];
  file = fopen(fileName, "r");

  while( fscanf(file, "%s", dummy) == 1 ){//counting at first
    count++;
  }
  fclose(file);

  array = (char**) malloc(count * sizeof(char*) );
  count = 0;
  file = fopen(fileName, "r");
    while( fscanf(file, "%s", dummy) == 1 ){//now putting values in array
      char newEntry[30];
      strcpy(newEntry,dummy);
      array[count] = newEntry;
      printf("%d - %s : %p \n",count, array[count], &array[count]);

      count++;
    }
  fclose(file);

  for(i=0;i<count;i++)
    printf("%d - %s : %p\n",i, array[i], &array[count] );


}

Спасибо

Ответы [ 3 ]

5 голосов
/ 20 октября 2010

Вам необходимо выделить новую память для newEntry каждый раз через цикл while. В настоящее время вы храните указатель на один newEntry буфер несколько раз.

Когда вы сказали, что проверили адреса, какой адрес вы проверяли конкретно?

И на самом деле, технически, вероятно, здесь то, что вы храните ссылки на переменную, которая выходит из области видимости после каждой итерации цикла while. Поскольку он выходит за рамки видимости, компилятор может свободно использовать эту стековую память, что он делает для следующей итерации цикла.

3 голосов
/ 20 октября 2010

user470379 правильно, вы не выделяете место для каждого нового слова. Одним из возможных исправлений является замена трех строк:

char newEntry[30];
strcpy(newEntry,dummy);
array[count] = newEntry;

с

array[count] = strdup(dummy);
0 голосов
/ 20 октября 2010

Я вижу одну проблему: счетчик не инициализирован, и вы используете его в своем malloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...