Защита динамически распределенных массивов

#c #constants

#c #константы

Вопрос:

Я хочу заполнить динамически созданный массив только один раз в верхней части моей функции. Тогда каждая функция после может получить доступ только к содержимому, но не изменять его. Каков правильный способ:

 const double *pt = malloc(sizeof(double)*num);
 

или

 double *pt = malloc(sizeof(double)*num);
void f(const double array[], ...);
 

Когда я использую второй метод, должен ли я приводить pt к const ?

Ответ №1:

Первый метод не будет работать, потому что вы не сможете заполнить массив в первую очередь (поскольку вы его объявили const ).

Второй метод будет работать, если вы уже заполнили массив перед вызовом f() .

Комментарии:

1. И вам не нужно приведение, чтобы добавить ‘const’.

2. @DavidSchwartz: Вы имеете в виду, что когда я вызываю функцию f, я могу просто передать ей pt, не приводя ее сначала к (const double *) ?

3. Правильно. Добавление ‘const’ является тривиальным преобразованием. (Удаление его, конечно, нет!)

Ответ №2:

Возможные решения:

  1. Создайте функцию ‘get’, которая принимает индекс и возвращает значение в массиве, например:
     double get(int index){
        return pt[index];
    }
     

    Сделать get общедоступным, но нет pt .

  2. Заполнить pt , но сохранить его закрытым и вместо этого сделать доступным указатель ‘const’, подобный этому:
     //kept private:
    double * pt = malloc(...);
    pt[0] = 1;
    pt[1] = 2;
    ....
    
    //make public
    double const * public_pt = (double const *)pt;
     

Комментарии:

1. Есть ли способ сделать вещи частными или общедоступными в C? НЕ C ?

2. @Rich: Да — вы можете сделать это, используя заголовочные / исходные файлы. Поместите определения для всех функций / переменных в ваш исходный файл (.c), но в заголовочном файле (который включают другие пользователи) объявляйте только те функции, к которым вы хотите, чтобы другие люди могли получить доступ.