嵌套指针的显式转换和 const 限定

问题描述 投票:0回答:1

我有一个以字符串数组作为参数的函数:

int parseArguments(int argc, const char* const* argv);

我想将所有内容标记为

const
以允许此函数的任何输入参数,无论是否为常量。现在,我想用
main
argv
来调用这个函数:

int main(int argc, char** argv)
{
    parseArguments(argc, (const char* const*)argv);
}

我知道将指针传递给需要指向 const 限定类型的指针的非限定类型是可以的(例如,将

char*
传递给期望
const char*
的函数)并且隐式转换不适用于嵌套指针(例如,将
char**
传递给期望
const char**
的函数会引发警告)。我也知道标准中解释原因的示例:

const char** cpp;
char* p;
const char c = ’A’;

cpp = &p;  // constraint violation
*cpp = &c; // valid
*p = 0;    // valid
// this code would end up modifying the value of a constant object

我认为它不适用于这里,因为我只是将嵌套指针传递给函数。

我想知道但在 C 标准中找不到的是,执行上面的显式转换以“添加嵌套 const 限定”是否是有效的操作,或者我是否必须执行以下操作:

size_t s = argc * sizeof(argv[0]);
const char** arr = malloc(s);
// error checking
memcpy(arr, argv, s);

我也可以直接定义

main
来具有常量参数 (
int main(int argc, const char** argv)
),但我更愿意让我的程序严格遵守。

c pointers casting language-lawyer
1个回答
0
投票

我认为这是标准中的一个缺陷,从

char **
的转换无法转换为
const char * const *

如标准示例所示,将

char **
值分配给
const char **
可能会导致修改
const
对象。 这种特殊情况下的问题是
const
限定符并未应用于每个指针“级别”,这将允许无效操作。

鉴于

const
限定符应用于示例中的每个级别,从
char **
const char * const *
的显式转换将不允许修改
const
限定对象,因此这可以被认为是安全的。

© www.soinside.com 2019 - 2024. All rights reserved.