如何用另一种(可能更短的)方式写这个? 有没有更好的方法在C ++中初始化已分配的数组?
int main(void) {
int* a;
a = new int[10];
for (int i=0; i < 10; ++i) a[i] = 0;
}
答案 0 :(得分:37)
int *a =new int[10](); // Value initialization
ISO C++ Section 8.5/5
对T类型的对象进行值初始化意味着:
- 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的); < / p>
- 如果T是没有用户声明的构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都是值初始化的;
- 如果T是数组类型,则每个元素都是值初始化的;
- 否则,该对象为零初始化
对于zero initialization
,value initialization
和default initialization
这两个词之间的差异,请阅读this
答案 1 :(得分:22)
std::vector<int> vec(10, 0);
int *a = &vec.front();
答案 2 :(得分:20)
您可以使用memset
将ptr指向的内存块的第一个num字节设置为指定值(解释为unsigned char)。
答案 3 :(得分:20)
3种方式怎么样?
1. int *a = new int[10]();
2. std::vector<int> a(10, 0);
3. int *a = new int[10];
memset(a, 0, sizeof(int) * 10);
由于受欢迎的需求,还有更多:
4. int *a = new int[10];
std::fill(a, a + 10, 0);
5. std::vector<int> a(10);
std::fill(a.begin(), a.end(), 0);
答案 4 :(得分:4)
int main(void) { int *a; a = new int[10]; for(int i=0;i<10;++i) a[i]=0; }
- )
答案 5 :(得分:2)
#include <algorithm>
int main() {
int *a = new int[10];
std::fill(a, a + 10, 0);
}
答案 6 :(得分:2)
int *a = (int*) calloc(10, sizeof(*a));
(并检查是否为NULL,或者重写一个针对calloc的安全包装器。)
答案 7 :(得分:1)
也许你可以尝试这样的事情:
int* initIntArray(int size) {
int *temp = new int[size];
for(int i = 0; i < size; i++) {
temp[i]=0;
}
return temp;
}
int main () {
int* a = initIntArray(10);
int* b = initIntArray(10);
int* c = initIntArray(10);
//do stuff with arrays
delete [] a;
delete [] b;
delete [] c;
return 0;
}
答案 8 :(得分:0)
我是一个C家伙,并不太确定“新”真的有什么用,但这可行吗?
int
main( void ) {
int i = 10; // start at the far end of the array
int *a = new int[10];
while ( i-- ) a[i] = 0; // while ( i == 9, 8, 7, ... , 0 )
}
只是为了展示我新的循环计数器最爱:while(条件)。
答案 9 :(得分:0)
int i*=(int[10])calloc(10*sizeof(int))