如何更改参数“;常数”;至“;非常量”;在C中调用函数时
当这个函数被其他函数调用时,我遇到了一个问题 我的职能是:如何更改参数“;常数”;至“;非常量”;在C中调用函数时,c,pointers,C,Pointers,当这个函数被其他函数调用时,我遇到了一个问题 我的职能是: void *table_lookup(const table *t) { ... //Here I want to call my other function. table_remove(t); ... } void table_remove(table *t) { ... } 我编译它时收到了警告。问题是我无法更改参数的类型。在C中,可以直接强制转换它以删除“const”属性 void
void *table_lookup(const table *t) {
...
//Here I want to call my other function.
table_remove(t);
...
}
void table_remove(table *t) {
...
}
我编译它时收到了警告。问题是我无法更改参数的类型。在C中,可以直接强制转换它以删除“const”属性
void *table_lookup(const table *t)
//Here I want to call my other function.
table_remove((table*)t) // remove 'const' by directly casting.
...
return
void table_remove(table *t)
...
您不能丢弃
常量
限定符。此后任何修改限定值const
的尝试都会调用未定义的行为。看
table_lookup
参数是const
有原因限定的。它允许编译器优化t
的使用。如果您丢弃了常量
并试图修改t
,您就违背了对编译器的承诺,即t
不会被修改
相反,您应该重构代码,以便remove()
函数调用其中的table\u lookup
,以获取(大概)指向要删除的节点的指针。然后删除节点
。不要尝试在表格查找中添加remove()
。创建一个新函数。您可以丢弃常量
限定符:table\u remove((table*)t)
但是如果table\u remove
尝试修改table
结构,例如如果它存储在只读段中,则可能会遇到问题
因此你不应该这样做。查找函数无论如何都会修改表,这是相当意外的。如果出于良好的原因,例如构建哈希表或维护缓存,则不应将参数声明为const
是,没错。抛弃常数限定符是个坏主意。我也不能添加新函数。((表)*)给出了问题 为什么您认为可以从const
表中删除内容?为什么在查找内容时需要删除内容?可能是输入错误,但是表t
与表中的表*t
不同。如果您直接将常量表*t
转换为(表*)t
,然后修改表*t
,您就完蛋了(可能是SegFault)。试图丢弃const
限定符是导致未定义行为的错误做法。