Я пытаюсь понять, как работают указатели и массивы указателей. Что я не понимаю в этой программе? - PullRequest
0 голосов
/ 09 февраля 2020
int main(){
  int i, department_quantity;
  char *passer[8];
  char *department_id = malloc(8);

  printf("Enter number of departments:");
  scanf("%d", &department_quantity);

  for(i = 0; i < department_quantity; i++){
      printf("Enter ID of department #%d\n", i + 1);
      scanf("%s", department_id);
      passer[i] = department_id;
  }

  string_array(&passer[0], department_quantity);

}

void string_array(char *array[], size_t length) {
    int i ;
    for (i = 0; i < length; i++) {
        printf("\n%s\n", array[i]);
    }
}

Пример вывода:

   Enter number of departments:2

   Enter id of department #1

   hello

   Enter id of department #2

   world

   world

   world

Я пытаюсь понять, почему я не могу заставить программу выводить другой ввод пользователя, то есть привет мир и не "мир мир". Что я не понимаю о указателях здесь?

1 Ответ

2 голосов
/ 09 февраля 2020

department_id - это точно такой же блок памяти. Для каждого ввода (каждой итерации) вы пишете по тому же адресу памяти, эффективно перезаписывая предыдущий контент. Итак, в конце все, что у вас есть, это последнее слово, которое вы ввели. Обратите внимание, что passer будет содержать эквивалентные элементы (указатель тот же).

Чтобы исправить это, вам нужно выделить память отдельно для каждой строки. Примерно так:

for(i = 0; i < department_quantity; i++) {
    // ...
    department_id = malloc(8); // here
    scanf("%s", department_id);
    passer[i] = department_id; // now passer[i] is a different pointer each time
}

Или вы можете угробить department_id и go для char passer[8][8], который не выделяет динамическую c память, а затем просто scanf("%s", passer[i]);.

PS Использование scanf таким способом довольно опасно, поскольку ничто не мешает вам вводить строку, которая слишком велика для размещения в выделенной памяти. Обычный подход был бы fgets(passer[i], 8, stdin), где passer - это char passer[8][8] - примечание 8 дается в качестве размера буфера.

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