use*_*713 4 c++ arrays initialization
我有一个C++基本程序,它列出了给定数量的素数.完成工作的类是下面的 - 我的问题是,当"amount"的输入为10(特别是10 - 它适用于我尝试过的所有其他数字)时,下面生成的数组未初始化为一个零的数组.因此,"数组的最后一个元素为空"返回false,并且我的代码无法正常运行.
我不知道我是否误解了,但不应该将int数组初始化为零?如果没有,整数10有什么特别之处,导致它初始化为奇怪的值?
int* primecalc(int amount) {
int* primes = new (nothrow) int [amount];
//Throw an error if we can't allocated enough memory for the array.
if (primes==0) {
cout<< "Error allocating memory.";
return 0;
}
//Otherwise, start iterating through the numbers.
else {
primes[0] = 2;
primes[1] = 3;
int p = 2;
for (int i=4;primes[amount]==0;i++) {
int j = 0;
int k = 0;
while ((primes[j]<=floor(i/2)) && !(primes[j]==0) && (k==0)) {
if ((i % primes[j]) == 0) {
k=1;
}
j++;
} //end the while loop
if (k==0) {
primes[p] = i;
p++;
}
} //end the for loop
} //end the "else" part (this was only necessary in case memory could not be allocated)
return primes;
}
Run Code Online (Sandbox Code Playgroud)
我也试过没有(nothrow),结果相同.在此先感谢您的帮助!
ild*_*arn 13
int* primes = new (nothrow) int[amount];正在使用默认初始化,对于标量,这int是一个noop(即没有执行实际的初始化).
如果要显式初始化,请使用值初始化:
int* primes = new (nothrow) int[amount]();
Run Code Online (Sandbox Code Playgroud)
从C++ 11标准,§8.5/ 6:
到默认初始化的类型的对象
T是指:
- 如果
T是(可能是cv限定的)类类型,则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);- 如果
T是数组类型,则每个元素都是默认初始化的 ;- 否则,不执行初始化.
如果程序要求对const限定类型的对象进行默认初始化
T,T则应为具有用户提供的默认构造函数的类类型.
第8.5节/ 7:
对值初始化类型的对象
T意味着:
- if
T是具有用户提供的构造函数的(可能是cv限定的)类类型,然后T调用默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);- 如果
T是没有用户提供的构造函数的(可能是cv限定的)非联合类类型,则该对象是零初始化的,如果T隐式声明的默认构造函数是非平凡的,则调用该构造函数.- 如果
T是数组类型,则每个元素都是值初始化的 ;- 否则,该对象被零初始化.
值初始化的对象被视为构造,因此受本国际标准的规定适用于"构造"对象,"构造函数已完成的对象"等,即使没有为该对象调用构造函数也是如此.初始化.
第8.5节/ 6:
到零初始化的类型的对象或参考
T指:
- 如果
T是标量类型,则将对象设置为值0(零),作为整数常量表达式,转换为T;- 如果
T是(可能是cv限定的)非联合类类型,则每个非静态数据成员和每个基类子对象都是零初始化的,并且填充初始化为零位;- if
T是一个(可能是cv限定的)联合类型,该对象的第一个非静态命名数据成员被零初始化,并且填充被初始化为零位;- if
T是数组类型,每个元素都是零初始化的 ;- 如果
T是引用类型,则不执行初始化.
最后来自§8.5/ 10:
初始化器为空的括号集的对象,即
(),应进行值初始化.
(都强调我的.)
| 归档时间: |
|
| 查看次数: |
3867 次 |
| 最近记录: |