gpt4 book ai didi

c - 无法将 char *[2] 类型数组的地址传递给采用 char *** 的函数

转载 作者:太空狗 更新时间:2023-10-29 16:58:10 29 4
gpt4 key购买 nike

我的 XCode(默认编译器应该是 clang?)向我显示此代码的警告:

将“char *(*)[2]”传递给“char ***”类型的参数的不兼容指针类型(调用 func 时)

void func (char ***arrayref, register size_t size) {
/// ...
}

int main()
{
char *array[2] = {"string", "value"};
func(&array, 2);
}

虽然这段代码没有问题(=没有警告):

void func (char **arrayref, register size_t size) {
/// ...
}

int main()
{
char *array[2] = {"string", "value"};
func(array, 2);
}

虽然这消除了警告

func((char***)&array, 2);

我仍然不知道为什么第一个发出警告,而后者没有。

此外,当第一个出现问题时,我还希望第一个发出如下警告:

将“char *[2]”传递给“char **”类型参数的不兼容指针类型

最佳答案

是时候简要回顾一下数组语义了。

除非它是 sizeof 的操作数或一元 &运算符,或者是用于在声明中初始化另一个数组的字符串文字,类型为“T 的 N 元素数组”的表达式将被转换(“衰减”)为类型为“指向 T 的指针”的表达式",表达式的值将是数组中第一个元素的地址。

表达式array在您的代码中具有类型“char * 的 2 元素数组”,或 char *[2] .当您将它作为参数传递给 func 时,如

func( array, 2 );

表达式转换为“指向char * 的指针”或char ** 类型的表达式,这是你的函数期望的类型,表达式的值是第一个元素的地址:array == &array[0] .这就是为什么您没有收到第二个代码片段的警告。

在第一个片段中,数组是一元 & 的操作数运算符,因此不会发生到指针类型的转换;相反,表达式的类型是“指向 2 元素数组 char * 的指针”,或 char *(*)[2] , 这与 char ** 不兼容.地址 value 相同(数组第一个元素的地址与数组本身的地址相同),但类型不匹配,因此出现警告。

为什么这很重要?指针只是一个地址,所有地址都是一样的,对吧?好吧,不。指针是地址的抽象,具有关联的类型语义。指向不同类型的指针不必具有相同的大小或表示形式,指针算法取决于所指向类型的类型。

例如,如果我将指针声明为 char **p; ,然后是表达式 p++将使指针指向下一个 char * 类型的对象, 或 sizeof (char *)来自当前地址的字节。如果p声明为 char *(*p)[2] , 但是,表达式 p++会提前p指向 char * 的下一个双元素数组 , 即 2 * sizeof (char *)来自当前地址的字节。

关于c - 无法将 char *[2] 类型数组的地址传递给采用 char *** 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18662581/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com