Как обращаться к ячейкам динамического массива, переданного в функцию? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Попытки присвоить значение или вывести на печать содержимое ячейки динамического массива заканчиваются Segmentation fault. Как правильно обращаться к ячейкам динамического массива в строках 22 и 25 внутри функции?
Листинг программы
  1. // example.c
  2. #include <stddef.h>
  3. #include <stdlib.h>
  4. void external_function(float **, size_t *);
  5. int main(void){
  6. float *dynamic_array;
  7. size_t size_of_dynamic_array=0;
  8. external_function(&dynamic_array,&size_of_dynamic_array);
  9. free(dynamic_array);
  10. return 0;
  11. }
Листинг программы
  1. // external_function.c
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. void external_function(float **dynamic_array, size_t *size_of_dynamic_array){
  6. // Тут производятся некие вычисления, в результате которых можно узнать, какого
  7. // размера будет динамический массив. Допустим, результат равен десяти:
  8. *size_of_dynamic_array=10;
  9. // Выделение памяти
  10. *dynamic_array = (float*) malloc(*size_of_dynamic_array * sizeof(float));
  11. for(size_t m=0; m<*size_of_dynamic_array; ++m) {
  12. // Попытки присвоить значение или вывести на печать содержимое ячейки динамического
  13. // массива заканчиваются Segmentation fault
  14. // Например, попытка заполнить ячейку динамического массива через fscanf() заканчивается
  15. // Segmentation fault
  16. if(!fscanf(ptrfile, "%f",&dynamic_array[m])) { ... }
  17. // Или попытка вывести содержимое ячейки тоже заканчивается Segmentation fault
  18. printf("dynamic_array[%zu]=%.2f\n",m,dynamic_array[m]);
  19. }
  20. }
Листинг программы
  1. gcc -pipe -g -O0 -Wall -Wextra -Wpedantic -Werror -Wshadow -std=c11 -c example.c
  2. gcc -pipe -g -O0 -Wall -Wextra -Wpedantic -Werror -Wshadow -std=c11 -c external_function.c
  3. gcc example.o external_function.o -o example

Решение задачи: «Как обращаться к ячейкам динамического массива, переданного в функцию?»

textual
Листинг программы
  1. main() {
  2.  int *a, size;
  3.  
  4.  f(&a, &size);
  5.  ....
  6. }
  7. void f (int **pa, int *size)
  8. {
  9.    int *ax = *pa; // Начиная с этого места *a === *ax. Обе эти переменные (a и ax) - есть один
  10.     //четырехбайтовый  кусок  памяти. Все, что вы ни сделаете  с ax - вы делаете и с a
  11.   ax = malloc... // a в main получит то же значение - указатель на выделенную память в куче
  12.   ax = realloc(ax, newsize); // майновское a получило новое значение, указатель на новый кусок
  13.   free(ax); // Кусок отдан на растерзание другим, но ax (и a!) на него по прежнему указывают, т.е. - в никуда.
  14.                // Пользоваться ими ни в функции, ни в майне нельзя
  15. }

Объяснение кода листинга программы

  1. В функции main() объявлены две переменные: a и size. Переменная a является указателем на int, а переменная size - на int.
  2. В функции main() вызывается функция f(), передавая ей в качестве аргументов указатель на переменную a и указатель на переменную size.
  3. В функции f() происходит следующее:
    • Объявляется переменная ax, которая является указателем на int и инициализируется значением переменной a.
    • Значение переменной ax изменяется на результат вызова функции malloc().
    • Значение переменной ax изменяется на результат вызова функции realloc().
    • Вызывается функция free(), передавая ей в качестве аргумента переменную ax.
    • После вызова функции free() значение переменной ax (и переменной a в функции main()) не меняется, поскольку они оба указывают на ту же область памяти.
  4. В конце функции main() есть пропущенное место, которое обозначено троеточием (...). Здесь могут находиться другие действия, которые не были указаны в вопросе.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.375 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы