假设我在 main() 中创建了一个指针数组,稍后我在该数组下分配内存并使用 fgets() 函数对其进行初始化。
int main(void){
char *p[5];
............
/* инициализация */
}
然后我想对给定的指针数组进行排序并调用 sort() 函数。为了不意外更改指针数组中的数据,我将排序函数的参数设为const,即:
void sorting(const char **p){
/* функция сортировки указателей */
}
但是,从 main() 调用此函数时,出现错误
int main(void){
.............
.............
sorting(p);
}
警告:
从不兼容的指针类型 [-Wincompatible-pointer-types] 排序(p)传递“排序”的参数 1;
预期为 'const char **' 但参数的类型为 'char **'
无效排序(const char **p){
据我所知,const 值可以用 NOT const 值初始化,但我读这个只是为了指针。请告诉我如何解决这个问题?
您的愿望是完全可以理解和自然的,但是在C中不允许隐式转换 from
char **
to 。const char **
乍一看,您似乎只是禁止修改字符串,但同时在正确性常数的保护中打开了另一个“漏洞”:如果可能,那么在您的函数内部,sorting
您可以安全地做,例如这将导致
p[0]
inmain
(of typechar *
) 指向一个 const 对象。你可以在不使用显式强制转换 (!) 的情况下实现这一点。在这里,为了不打开这样的安全漏洞,C 不允许隐式转换
T ** -> const T **
。你不能随便想出一个漂亮的解决方案......在
main
你身上,比方说,你需要完全char *[]
,但在sorting
你身上,比如说,你想得到准确的const char *[]
。在这种有限的情况下,只需要应用显式类型转换即可。为了不使用显式转换乱扔代码,如果您不介意这种做法,可以将其隐藏在宏中