如何更改参数“;常数”;至“;非常量”;在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
限定符是导致未定义行为的错误做法。