【发布时间】:2023-03-03 19:44:01
【问题描述】:
今天早些时候,我正在研究这个问题:Why does one need to specify the row while assigning a pointer to a 2D Array? 在尝试将多维数组的标识符分配给指针时所涉及的类型存在一些混淆/分歧。具体来说,它是否会“衰减”或“转换”(或任何您喜欢的命名法,因为似乎对此也存在分歧)为 char ** 或 char ()[5] 或 char (*)[5]。
(基于下面的cmets,我在这里包含了来自链接问题的代码示例。不要怪我,不是我写的。)
int main()
{
char onedstring[]={"1D Array"};
char twodstring[][5]={"2D","Array"};
char *p1,*p2;
p1=onedstring;
p2=twodstring;
p2=twodstring[1];
}
我测试了我的编译器如何从该问题的代码中报告警告并得到以下结果:
(编译器:gcc 版本 5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1~16.04.4))
decay.c:15:7: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
p2=twodstring;
它报告不兼容的指针类型但不报告所涉及的类型,这在这种情况下非常有用。我还没有找到一种方法(还)让那个特定的警告也显示类型。但是,我发现调用函数而不是赋值 确实 会导致包含类型的注释。这是示例代码(请注意,除了生成编译器警告之外,它绝对没有其他用途):
void function_to_trigger_warning(char *c){}
int main(int argc, char **argv)
{
char onedstring[]={"1D Array"};
char twodstring[][5]={"2D","Array"};
function_to_trigger_warning(onedstring);
function_to_trigger_warning(twodstring);
return 0;
}
这是警告输出:
decay.c: In function ‘main’:
decay.c:20:33: warning: passing argument 1 of ‘function_to_trigger_warning’ from incompatible pointer type [-Wincompatible-pointer-types]
function_to_trigger_warning(twodstring);
^
decay.c:7:6: note: expected ‘char *’ but argument is of type ‘char (*)[5]’
void function_to_trigger_warning(char *c)
^
看起来,根据 gcc,twodstring 被视为 char (*)[5] 用于指针分配。这是有价值的信息!
长话短说(我知道,为时已晚):gcc 中有没有办法从其他指针分配警告中获得类似的输出?
【问题讨论】:
-
对于我正在使用的 gcc 版本,显然不是 - 在不兼容的指针类型之间的常规分配中,我只得到
assignment from incompatible pointer type。至于确定数组表达式“衰减”到什么,T数组衰减为指向T的指针 - 如果T是类似int的标量,则int数组衰减为指向@ 的指针987654338@。如果T是“int的数组”,则int数组的数组衰减为指向int数组的指针等 -
请在未显示预期信息的地方发布MCVE
-
@M.M - 如帖子中所示,我使用了链接问题中的代码示例。我认为没有理由在这里复制该代码。如果其他人认为它有帮助/必要,那么我会这样做。
-
很明显。不需要海事组织。很容易检查。
-
@PeterJ_01 - 包含在此处而不是链接的原因是不能保证该链接在一年后仍然有效,从而使依赖于链接内容的问题和答案一文不值。问题中应包含所有必要的代码。
标签: c gcc gcc-warning