通过读取用户的值创建一个包含 10 个整数的输入数组
Create an input array of 10 ints by reading values from the user
我正在尝试以下代码:
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++ 中,不允许使用可变长度数组,数组必须是固定大小的,如果您想动态分配大小,您可能需要使用 malloc
并手动分配内存。但是,int
的默认值在这里起作用。我不推荐这种做法,因为它可能会产生未定义的行为。阅读这些链接 Array[n] vs Array[10] - Initializing array with variable vs real number and Why aren't variable-length arrays part of the C++ standard? 他们有一些很好的解释。
what exactly happens
int n ;
int b[n] ;
使用未初始化整数(窄字符类型除外)的值具有未定义的行为(UB)。此外,由于 n
不是编译时常量,而是用作数组的大小,根据 C++ 标准,程序是病式的(这意味着允许编译器拒绝编译程序,并且至少需要显示诊断消息)。
但是,如果您的编译器支持可变长度数组(VLA,一种语言扩展),那么究竟会发生什么取决于编译器已经实现了 VLA(当然,它如何处理你引入的 UB)。
Then why is declaration of b
valid.
事实上,在标准 C++ 中无效。
Does the sizeof(b)
indicate that this just treated as a int
pointer
没有。由于行为未定义,因此输出没有任何指示。即使 int
指针的大小恰好在您的系统上为 4,输出恰好相同也只是偶然。
首先,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
.
我正在尝试以下代码:
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++ 中,不允许使用可变长度数组,数组必须是固定大小的,如果您想动态分配大小,您可能需要使用 malloc
并手动分配内存。但是,int
的默认值在这里起作用。我不推荐这种做法,因为它可能会产生未定义的行为。阅读这些链接 Array[n] vs Array[10] - Initializing array with variable vs real number and Why aren't variable-length arrays part of the C++ standard? 他们有一些很好的解释。
what exactly happens
int n ; int b[n] ;
使用未初始化整数(窄字符类型除外)的值具有未定义的行为(UB)。此外,由于 n
不是编译时常量,而是用作数组的大小,根据 C++ 标准,程序是病式的(这意味着允许编译器拒绝编译程序,并且至少需要显示诊断消息)。
但是,如果您的编译器支持可变长度数组(VLA,一种语言扩展),那么究竟会发生什么取决于编译器已经实现了 VLA(当然,它如何处理你引入的 UB)。
Then why is declaration of
b
valid.
事实上,在标准 C++ 中无效。
Does the
sizeof(b)
indicate that this just treated as aint
pointer
没有。由于行为未定义,因此输出没有任何指示。即使 int
指针的大小恰好在您的系统上为 4,输出恰好相同也只是偶然。
首先,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
.