#c #указатели #const
Допустим, я создаю в main() массив указателей, под которые позже выделяю память и инициализирую посредством функции fgets(). int main(void){ char *p[5]; ............ /* инициализация */ } Затем я хочу отсортировать данный массив указателей и вызываю функцию sorting(). Для того, чтобы случайно не изменить данные в массиве указателей, аргумент функции sorting я сделаю const, тобишь: void sorting(const char **p){ /* функция сортировки указателей */ } Однако при вызове данной функции из main(), я получаю ошибку int main(void){ ............. ............. sorting(p); } предупреждение: passing argument 1 of ‘sorting’ from incompatible pointer type [-Wincompatible-pointer-types] sorting(p); expected ‘const char **’ but argument is of type ‘char **’ void sorting(const char **p){ Насколько мне известно, то const значения можно инициализировать НЕ const значениями, но это я читал для просто указателей. Скажите, пожалуйста, как решить данную проблему?
Ответы
Ответ 1
Ваше желание вполне понятно и естественно, но тем не менее в С не разрешено неявное приведение типа от char ** к const char **. На первый взгляд вам кажется, что вы просто запрещаете модификацию строк, но вместе с этим вы открываете другую "дыру" в защите константой корректности: если бы это было возможно, то внутри вашей функции sorting вы могли бы спокойно сделать, например p[0] = <адрес какого-то константного объекта типа char>; // Например: // static const char s[] = "Hello World!"; // p[0] = s; что привело бы к тому, что p[0] в main (имеющее тип char *) стало бы указывать на константный объект. И вы этого добились бы без применения явного приведения типа (!). Вот для того, чтобы не открывать такой дыры в защите, С не разрешает неявных преобразований T ** -> const T **. Красивого решения тут навскидку не придумаешь... В main вам, допустим, нужен именно char *[], а в sorting вы, допустим, хотите получать именно const char *[]. В такой ограниченной ситуации остается только применить явное приведение типа. Чтобы не замусоривать код явными приведенями можно, если вам не претит такая практика, спрятать его в макро #define sorting(p) sorting((const char **) (p))
Комментариев нет:
Отправить комментарий