不兼容的常量指针

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

将非常量指针传递给需要常量指针的函数通常不会引发警告(这是有道理的,该函数承诺比调用者期望的“更好”),但将非常量指针指向指针期望 const 指针到指针的函数确实会发出警告(带有

gcc -Wall
,11.4),我正在努力思考为什么

#include <stdio.h>

int foo(const int *i)
{
  return *i;
}

int bar(const int **i)
{
  return **i;
}

int main(void)
{
  int i = 3, *pi = &i, **ppi = &pi;

  printf("foo: %i\n", foo(pi));
  printf("bar: %i\n", bar(ppi));

  return 0;
}

给予

$ gcc -Wall -o const const.c
const.c: In function ‘main’:
const.c:18:27: warning: passing argument 1 of ‘bar’ from incompatible pointer type [-Wincompatible-pointer-types]
   18 |   printf("bar: %i\n", bar(ppi));
      |                           ^~~
      |                           |
      |                           int **
const.c:8:21: note: expected ‘const int **’ but argument is of type ‘int **’
    8 | int bar(const int **i)
      |         ~~~~~~~~~~~~^
$ ./const 
foo: 3
bar: 3

有什么关于为什么的启示吗?

c pointers
1个回答
0
投票

C标准中给出了原因。以下代码来自 C 2018 6.5.16.1 6。评论是我的。

鉴于这些声明:

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

假设我们允许(通过函数调用或直接赋值)将

char *
分配给
const char **
,如下所示:

cpp = &p;

然后,由于

*cpp
const char *
,我们可以为它分配一个
const char *
,如下所示:

*cpp = &c;

由于

*cpp
p
,因此已将
p
更改为指向
&c
*p
是一个
char
,我们可以为它赋值
char
:

*p = 0;

这会改变

c
,它是用
const
定义的。所以这是不能允许的。禁止赋值
cpp = &p;
,因此不会发生这种情况。

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