gpt4 book ai didi

c - 关于警告 : "note: expected ' const int * *' but argument is of type ' int * *'"

转载 作者:太空宇宙 更新时间:2023-11-04 05:11:39 25 4
gpt4 key购买 nike

我用 C 编写“将动态 2D 传递给函数”的代码。

以下代码编译成功并运行良好。

void iter_2d(const int** arr, 
const size_t row,
const size_t column) {
// ..some code
}

int main(){
const size_t column = 3, row = 4;
int** arr = (int**)malloc(sizeof(int*) * row);
for (size_t i = 0; i < row; i++)
arr[i] = (int*)malloc(sizeof(int) * column);
// init val for array
iter_2d(arr,row,column);
// clear array

}

但我收到警告:

t.c:24:11: warning: passing argument 1 of 'iter_2d' from incompatible pointer type [-Wincompatible-pointer-types]
iter_2d(arr,row,column);
^~~
t.c:4:26: note: expected 'const int **' but argument is of type 'int **'
void iter_2d(const int** arr,
~~~~~~~~~~~~^~~

我认为函数 iter_2d 只是迭代数组的值,不能在函数 iter_2d 中修改,

所以输入参数arr应该是const to pointer

但是编译器显示这个警告让我感到困惑。

最佳答案

char **const char ** 的转换违反约束的原因在 6.5.16.1 6 示例 3 的 C 2018 标准中给出。假设我们有:

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

接下来,考虑&p。这是一个 char **。如果我们允许转换为 const char **,那么我们可以将它分配给 cpp:

cpp = &p; // Violation of C constraints for assignment.

假设我们这样做了。那么cpp是一个const char **,所以*cpp是一个const char *。这意味着我们可以为它分配一个 const char 的地址,如下所示:

*cpp = &c;

现在 *cpp 是指向 c 的指针。因为cpp指向p,所以*cpp就是p,也就是说p指向 c。所以现在我们可以这样做:

*p = 0;

这改变了 c,但是 c 是一个 const char,我们不应该改变它。

因此,允许从 char **const char ** 的转换违反了常量对象的预期行为。

此示例使用赋值表达式,但将参数传递给函数的行为被定义为类似于将参数分配给参数。约束是相同的。

关于c - 关于警告 : "note: expected ' const int * *' but argument is of type ' int * *'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57419550/

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