gpt4 book ai didi

c - C中是否允许通过指向不完整数组类型的指针的多维数组 "reformat"?

转载 作者:太空狗 更新时间:2023-10-29 17:04:15 25 4
gpt4 key购买 nike

考虑以下声明:

int a[M][N]; // M and N are known compile-time

像声明的那样对待它是否合法:

int a[N][M];

甚至:

int a[A][B]; // where A * B = M * N

在 C 中没有违反其规则(严重)?

我发现它可以在没有任何转换的情况下完成:

#include <stdio.h>

void print_array(int a[][2], int n);

int main(void)
{
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};

//int (*p1)[2] = a; // compile error

int (*ptr_temp)[] = a; // pointer to array of incomplete type
int (*p2)[2] = ptr_temp; // compiles without any warning

print_array(p2, 3);
}

void print_array(int a[][2], int n)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < 2; j++)
printf("a[%d][%d] = %d\n", i, j, a[i][j]);
}

请注意,我们不能将a 直接分配给p1 指针。然而,当 p2 被分配给 ptr_temp 时,编译器不会提示,即使它看起来有潜在危险(它不需要任何转换)。真的 sanitizer 了吗?如果是这样,那么为什么它不允许第一个赋值?

最佳答案

您看到的行为是因为 C 中处理多维数组的方式。

看看这个问题Pointer address in a C multidimensional array

关于c - C中是否允许通过指向不完整数组类型的指针的多维数组 "reformat"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31443077/

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