views:

524

answers:

10

How to write this in another (perhaps shorter) way? Is there a better way to initialize an allocated array in C++?

int main(void) {
   int* a;
   a = new int[10];
   for (int i=0; i < 10; ++i) a[i] = 0;
}
+17  A: 

You could use memset

Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).

ChrisF
Old, I know, but there's really no reason to use `memset`. `std::fill` is a more generic way of getting the same thing (which means the code can be consistent) at no loss.
GMan
+33  A: 
 int *a =new int[10](); // Value initialization

ISO C++ Section 8.5/5

To value-initialize an object of type T means:

— if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);

— if T is a non-union class type without a user-declared constructor, then every non-static data member and base-class component of T is value-initialized;

— if T is an array type, then each element is value-initialized;

otherwise, the object is zero-initialized

For differences between the terms zero initialization, value initialization and default initialization, read this

Prasoon Saurav
This *is* better because it deals well with arrays of objects and in a template context. But bear in mind that for the simple example given above the generated code is likely to be very similar (perhaps identical).
dmckee
+3  A: 
int main(void) { int *a; a = new int[10]; for(int i=0;i<10;++i) a[i]=0; }

;-)

nob
That has 9 superfluous spaces in it - much too readable!
Jonathan Leffler
you are right:`int main(){int i,*a=new int[10];for(i=0;i<10;++i)a[i]=0;}`
nob
you are right: `int(main)(){int*a=new(int[10])();}`
Roger Pate
+18  A: 
std::vector<int> vec(10, 0); 
int *a = &vec.front();
Brian R. Bondy
+1 for recommending `std::vector`
Prasoon Saurav
And the 0 isn't even required, since `int()` is the default value.
Roger Pate
+13  A: 

How about 3 ways?

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);

Due to popular demand, a couple more:

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);
Justin Ardini
No `::std::fill`? :-)
Omnifarious
@Omnifarious: I was actually about to include `fill`, but I just like the number 3 more than 4. :)
Justin Ardini
also `int a[10] = {0};` could be an alternative way.
Nick D
A: 

I'm a C guy and not too sure what "new" really does, but could this work?


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 )
}

Just to show off my new loop-counter favorite: while(condition).

Pete Wilson
1) why is `i` static? 2) Why `while` instead of the established, idiomatic `for`?
Konrad Rudolph
Where is the calloc :P, if you are a C guy ?
Andrei Ciobanu
@Konrad: `static` is zero initialized; and `while` is different from `for`. I agree with you, though: outside the scope of this question, I'd be upset with someone who presented the code shown as a good way of doing things.
Jonathan Leffler
@Andrei, I forgot about calloc, dang it :-) I started trying this technique about 6 mmonths ago; it's beginning to seem cleaner and more obvious. Tons of off-by-one mistakes in the beginning. A somewhat more obscure version:<pre><code> int i = 10; int *a = new int[10]; while ( i-- ) a[i] = 0;</code></pre>
Pete Wilson
+2  A: 
#include <algorithm>

int main() {
    int *a = new int[10];
    std::fill(a, a + 10, 0);
}
Daniel Trebbien
A: 

Maybe you could try something like this:

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;
}
jmont
is there a reason someone voted down this answer?? i'd like to what I did wrong (seriously!! no sarcasm here)
jmont
Your answer seems fine. I don't understand the downvotes either.
Aaron McDaid
@jmont: This is just bad advice; it's nearly an exact copy of std::fill_n with downsides but no benefit.
Roger Pate
I didn't down-vote, but I think the problem some may have had is that this doesn't deviate much from the OP's original problem. I think the OP is trying to eliminate writing a for-loop to do the initialization.
Steve Guidi
+2  A: 
int *a = (int*) calloc(10, sizeof(*a));

(and check if is NULL, or rewrite a safe wrapper against calloc).

Andrei Ciobanu
A: 

by the way, what about using calloc()? say

int i*=(int[10])calloc(10*sizeof(int))

well i'm just another C guy.. any comment is welcomed here

jokester
Because in C++, people generally use `new` and if you use `calloc` you have to use `free` instead of `delete`.
Brendan Long