gpt4 book ai didi

c - C 中数组类型有不完整元素类型错误

转载 作者:行者123 更新时间:2023-11-30 14:31:43 25 4
gpt4 key购买 nike

所以,当我像这样声明 int arr 时,代码只能正常工作,并且能够打印 int arr 内容:

int arr[][3] = {{2,4,6}, {8,1,7}, {2}};

但是当我声明 int arr[3][]

int arr[3][] = {{2,4,6}, {8,1,7}, {2}};它显示了上面的错误。

问题: 1. 为什么2打印“200”?由于它首先仅声明为 {2} int arr[][3] = {{2,4,6}, {8,1,7}, {2}};输出是:

246
817
200
  • 为什么int arr[3][] = {{2,4,6}, {8,1,7}, {2}};显示上面的错误?

     #include<stdio.h>

    int main(int argc, char const *argv[]){

    int arr[3][] = {{2,4,6}, {8,1,7}, {2}};
    int i, j;

    for(i=0 ; i < 3 ; i++){
    for(j=0 ; j<3 ; j++){
    printf("%d", arr[i][j]);
    }
    printf("\n");
    }

    return 0;
    }
  • 最佳答案

    int arr[][3] = {{2,4,6}, {8,1,7}, {2}};arr[2][0]明确地到2。 arr[2][1]arr[2][2]自动设置为零——当一个对象被显式初始化但省略了一些初始化器时,对象的相应部分将被初始化,就像给定零一样(指针类型为空指针,算术类型为零,对于聚合也是递归地) .

    int arr[][3] ,第一维可以省略,因为它是通过对初始化器进行计数来确定的。暂时允许有不完整的类型,因为在编译器检查初始化器时没有其他东西依赖于它。

    int arr[3][] ,第二个维度不能被省略,因为形成更大的数组 arr[3] ,要求其元素类型完整。原因之一是编译器支持不完整类型需要更多工作,如下所述。

    为了证明这些要求的合理性,请注意,要处理 int arr[][3] 的初始值设定项,编译器所要做的就是将子数组的每个元素放在已知的位置。当编译器看到 arr[i][j] 的初始值设定项时,其中ij通过在处理初始值设定项时进行计数或通过显式下标指示符(如 int arr[][3] = { [2] = { 1, 2, 3 }}; 中所示),编译器将初始值设定项值写入构建数组值的缓冲区中的位置 i*3+j 。有时,当 i 增加时,编译器可能需要重新分配空间并将所有内容复制到更大的空间(如 realloc ),但这是它在处理所有初始化程序时必须执行的唯一重新排列,无论它们是什么。

    相反,请考虑编译器如何处理 int arr[3][] = { … }; 。编译器可以读取每个 { … }内外{ … }并找出哪一个元素的数量最多,并将其作为数组的维度。但它必须做以下两件事之一:

    • 它必须首先读取所有初始化程序以计算出计数,然后返回并再次读取它们以将它们的值放入用于构建数组的缓冲区中,或者
    • 在构建缓冲区时,当它发现一个用 { … } 初始化的子数组时由于元素多于先前子数组中的元素,它必须重新排列缓冲区中的大部分值才能使用新的子数组大小。

    这比我们希望编译器要做的工作更多。

    此外,如果不知道完整类型,初始化器可以包含无法计算的表达式,如以下糟糕的代码所示:

    void *a[][3] = {  {0, 0, 0}, {&a[0][1], &a[0][2], &a[0][0]} };

    关于c - C 中数组类型有不完整元素类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60170681/

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