【发布时间】:2020-03-06 09:10:17
【问题描述】:
嘿,有人能告诉我为什么在这个例子中会出现值 11 11,如果我理解正确的话 主块中的 p 是指向 Integer 的常量指针,这意味着我无法更改其地址的值 我怎么能在函数 foo 中通过
做到这一点 #include <stdio.h>
int j = 11;
void foo(int **);
int main()
{
int i = 10;
int *const p = &i;
foo(&p);
printf("%d\n", *p);
}
void foo(int **p)
{
*p = &j;
printf("%d\n", **p);
}
【问题讨论】:
-
请不要更新您的问题来解决已发布答案中的问题。这可能会使答案变得无用,有时如果您解决了所有问题,甚至您的问题也可能变得无用。请记住,这个论坛不仅是为了解决您此时此地的问题,而且也是为了让其他人在未来找到类似(或完全相同)问题的解决方案。
-
这段代码不是有效的 C,所以如果一些编译器让它通过,不管任何人的猜测,它会做什么。您根本无法将
int*const*隐式转换为int**。 -
@Someprogrammerdude 原始代码包含几个与所问问题无关的错误。请参阅我对更改的解释。编辑在被接受之前确实需要同行评审。我的编辑被接受了,这样答案就可以集中在被丢弃的限定词的概念上,而不是他特定的 sn-p 的特质。
-
@Lundin 尝试让 clang 或 gcc 准确地编译上面的代码 sn-p。它工作正常,但它们都给出丢弃的限定符警告。生成的可执行文件为两者打印
"11\n11\n"。 -
@WilliamRosenbloom C 语言中没有“编译器错误”之类的东西,这就是原因。编译器只需要在 C 语言违规时给出诊断信息。如果编译器选择通过警告、错误或发送到程序员家门口的手写便条来做到这一点,则与 C 标准无关。它仍然是违反语言标准的约束。如果您希望 gcc 或 clang 为您提供 C 语言违规的编译器错误,您必须使用
-std=c11 -pedantic-errors进行编译。