【问题标题】:Create an input array of 10 ints by reading values from the user通过读取用户的值创建一个 10 个整数的输入数组
【发布时间】:2017-03-01 12:44:49
【问题描述】:

我正在尝试以下代码:

int main() {
    int x[10] ;
    int a[] = {1,2,3,4,5} ;
    int n ;
    int b[n] ;
    //int c[] ; gives compilation error

    cout<<sizeof(x)<<endl ; //prints 40
    cout<<sizeof(a)<<endl ; //prints 20
    cout<<sizeof(b)<<endl ; //prints 4
}

现在我的问题是当我定义b 时究竟会发生什么。 我试图阅读类似问题的答案,但没有得到满意的答复。 因为数组是静态创建的,所以在声明它们时必须给出大小。那为什么b 的声明是有效的。 sizeof(b) 是否表示这只是被视为int pointer

【问题讨论】:

标签: c++ arrays initialization sizeof


【解决方案1】:

究竟发生了什么

int n ;
int b[n] ;

使用未初始化整数的值(窄字符类型除外)具有未定义的行为(UB)。此外,由于n 不是编译时间常数,而是用作数组的大小,因此根据 C++ 标准,程序是病态的(这意味着允许编译器拒绝编译程序,并且至少需要显示诊断消息)。

但是,如果您的编译器支持可变长度数组(VLA,一种语言扩展),那么究竟会发生什么取决于编译器如何实现 VLA(当然还有,如何处理您介绍的 UB)。

那为什么b的声明有效。

事实上,在标准 C++ 中有效。

sizeof(b) 是否表示这只是被视为int 指针

没有。由于行为未定义,因此输出不表示任何内容。即使int 指针的大小在您的系统上恰好是 4,输出也只是偶然地相同。

【讨论】:

    【解决方案2】:

    在 C++ 中,不允许使用可变长度数组,数组必须是固定大小的,如果您想动态分配大小,您可能需要使用 malloc 并手动分配内存。但是,int 的默认值在这里起到了作用。我不会推荐这种做法,因为它可能会产生未定义的行为。阅读这些链接Array[n] vs Array[10] - Initializing array with variable vs real numberWhy aren't variable-length arrays part of the C++ standard? 他们有一些很好的解释。

    【讨论】:

    • However, the default value of int serves the purpose here.但是本题代码中没有int的默认值,有一个int的随机值n
    【解决方案3】:

    首先,int b[n] 不是有效的 C++ 代码,除非 n 是常量表达式。仅仅因为您使用 GCC,您就可以侥幸逃脱,并且它被允许作为扩展名 (https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html#Variable-Length)。

    其次,要检查发生了什么,让我们看看这个:

    我的程序 var-arr.cpp:

    #include <iostream>
    
    using namespace std;
    
    int main() {
        int m=0, n=5, k;
        int a[m], b[n], c[k];
        cout
        << "sizeof(a)=" << sizeof(a)
        << " sizeof(b)=" << sizeof(b)
        << " sizeof(c)=" << sizeof(c)
        << endl;
    }
    

    这是我编译并运行它时发生的情况([~/CPP] 是提示符)

    [~/CPP] g++ -o var-arr var-arr.cpp
    [~/CPP] ./var-arr
    sizeof(a)=0 sizeof(b)=20 sizeof(c)=0
    

    一段时间后

    [~/CPP] ./var-arr
    Segmentation fault (core dumped)
    

    这是什么意思?这意味着当您在函数中写入int n; 时,n 保持未初始化状态。所以当你在它后面写int a[n]; 时,a 的长度可以是任何东西。它也可能太大而无法分配a

    【讨论】:

      猜你喜欢
      • 2017-07-17
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      相关资源
      最近更新 更多