警告:传递'foo'的参数1从指针目标类型中丢弃'const'限定符

时间:2016-04-30 09:06:19

标签: c compiler-errors const compiler-warnings

#include<stdio.h>
void foo(int **p)
{
    int j=11;
    *p = &j;
    printf("%d ", **p);
}
int main(void)
{
    int i = 10;
    int *const p = &i;
    foo(&p);
    printf("%d ", *p);
    return 0;
}

编译时:

example.c:12:2: warning: passing argument 1 of ‘foo’ discards ‘const’ qualifier from pointer target type [enabled by default]
  foo(&p);
example.c:2:6: note: expected ‘int **’ but argument is of type ‘int * const*’
  void foo(int **p)

运行中:

11 11

这里p是一个常量指针,那么为什么没有错误来改变它的内容而只是警告?

我对上述计划的疑问是因为以下计划:

#include<stdio.h>
int main(void)
{
    int var1 = 0, var2 = 0;
    int *const ptr = &var1;
    ptr = &var2;
    printf("%d\n", *ptr);
    return 0;
}

编译时:

error: assignment of read-only variable ‘ptr’
    ptr = &var2;

4 个答案:

答案 0 :(得分:0)

int * const p;表示指向int 的Const指针,其中p不能指向其他位置。所以,你得到了警告。

答案 1 :(得分:0)

  

为什么这里没有更改常量位置的错误   只是警告?

<强>案例1

事实上在:

void foo(int **p) // p is a pointer to pointer to int
 {
    int j=11;
    *p = &j;  //equivalent of p = &i in main()
    printf("%d ", **p);
}

您未在主要内容中更改p的值。你呢?是

通过

*p = &j;

您只是更改main() p中存储的值。

<强>情况2

ptr = &var2; // You are making ptr point to the memory address of &var2

这是违法的,因为ptrconstant

答案 2 :(得分:0)

int * const p是指向int的常量指针(p的位置仅供读取使用)

foo的原型必须是

void foo(int * const *p) - &gt;指向int的const指针的指针(*p的位置是只读的)

*p = &j;

error: assignment of read-only location ‘*p’

但这是有效的:

**p = j; - &gt;取消引用*p =访问i

中的main

您正在寻找:

#include <stdio.h>

void foo(int * const *p)
{
    int j = 11;

    **p = j;
    printf("%d ", **p);
}

int main(void)
{
    int i = 10;
    int * const p = &i;

    foo(&p);
    printf("%d ", *p);
    return 0;
}

输出:

11 11

相同
int var1 = 0, var2 = 0;
int *const ptr = &var1;
ptr = &var2; <-- You can not change the location of ptr

答案 3 :(得分:0)

  

为什么更改内容没有错误,只是警告?

在第一种情况下,您只是“仅”获得警告,因为您只是通过将const传递到可能被滥用的上下文中来准备路由到灾难,即被分配一些东西。然而,尚不清楚是否真的得到了分配。

在第二种情况下,代码实际上 它可能没有,它分配给const,因此编译器将其视为错误。