Почему первое значение массива заменяется? - PullRequest
0 голосов
/ 01 апреля 2019

Я не понимаю, почему первое значение моего массива изменяется вне внутреннего цикла while, когда «i» увеличивается правильно. Я выделяю память таким образом, чтобы что-то испортилось? Как мне исправить эту проблему?

int main(void) 
{
  int sizeArray = 5, sizeString = 10;
  FILE *fin = fopen("file.txt", "r");
  char ** arr = (char **) malloc(sizeArray * sizeof(char *));
  char line[1000];
  char *word;
  int i = 0;
  while(fgets(line, 100, fin) != NULL)
  {
    word = strtok(line, " ");
    while (i < 2)
    {
      arr[i] = (char *)malloc(sizeString * sizeof(char));
      arr[i] = word;
      printf("Inner print: %s\n\n",arr[0]);
      word = strtok(NULL, " ");
      i++;
    }

  }
    printf("This is the final arr[0] (outer print): %s",arr[0]);

}

file.txt читается как:

First second.
Third! Fourth

Печать с моей консоли выглядит следующим образом:

Inner print: First

Inner print: First

The final arr[0] (outer print): Third!

Когда я хочу, чтобы внешний отпечаток был: Первый

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Вы выделяете немного памяти с помощью arr[i] = (char *)malloc(sizeString * sizeof(char));. Затем вы немедленно перезаписываете этот указатель (утечка памяти) с помощью arr[i] = word, так что arr[i] теперь указывает где-то в буфере line.

Вам необходимо скопировать строку, указанную word, в буфер, выделенный для arr[i]:

strcpy_s(arr[i], sizeString * sizeof(char), word);
0 голосов
/ 01 апреля 2019

Вам нужно переместить int i = 0; внутрь внешнего цикла while. Или, по крайней мере, обнулить его, когда внутренний цикл завершен.

arr[i] = word - это не то, как вы копируете строки в C. Посмотрите на strcpy, или даже лучше, strncpy.

Выполнение arr[i] = word сразу после выполнения arr[i] = (char *)malloc делает malloc совершенно бесполезным. ЕДИНСТВЕННАЯ вещь, которую это выполняет, состоит в том, чтобы выделить пространство и затем выбросить указатель, приводя к утечке памяти.

...