View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# \why can't I initialize a multidimensional C array with zeroes

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

19 replies to this topic

### #1gasto  Members

Posted 31 March 2014 - 07:41 PM

Why can't I simply initialize to zeroes a C multidimensional array as one would normally initialize a one dimensional array:

int arr[3]= {0}; / *yep.*/
int multArr[3][2] = {{0}}; /* nicht! */


Intel Core 2 Quad CPU Q6600, 2.4 GHz. 3GB RAM. ATI Radeon HD 3400.

### #2Álvaro  Members

Posted 31 March 2014 - 07:42 PM

POPULAR

Do you have a compiler error, or something?

### #3incertia  Members

Posted 31 March 2014 - 07:45 PM

Use
int multArr[3][2] = {0};


what

### #4aregee  Members

Posted 31 March 2014 - 08:20 PM

Technically this is the correct way:

int multArr[3][2] = { {0, 0}, {0, 0}, {0, 0} };

Doing as incertia suggests works too, but technically this is what happens:

1. The first value will be set to 0.

2. The values the are lacking will be set to 0.

Meaning that if you would initialise like this:

int multArr[3][2] = { 1 };

You would set the first value to 1, and the values that are lacking will be set to 0.

Edited by aregee, 31 March 2014 - 08:56 PM.

### #5Samurai Jack  Members

Posted 01 April 2014 - 01:57 AM

int multArr[3][2] = { {0, 0}, {0, 0}, {0, 0} };

Yes. Aregee has it correct. On the other hand, you can allways use memset?

memset(multArr, 0, sizeof(multArr));

### #6Álvaro  Members

Posted 01 April 2014 - 02:33 AM

Can anyone explain what the problem was with the original code? It works for me...

### #7L. Spiro  Members

Posted 01 April 2014 - 03:29 AM

POPULAR

There is absolutely nothing wrong with the original code; it is fully standard compliant and likely compiles on all compilers. It even compiles on the C compiler I wrote, and I wasn’t really aiming to be fully featured in some areas.

Use

int multArr[3][2] = {0};


This compiles but it in terms of correctness, “int multArr[3][2] = {{0}};” is better.

Technically this is the correct way:

int multArr[3][2] = { {0, 0}, {0, 0}, {0, 0} };

The original poster is likely looking for a way that does not require him or her to rewrite the whole initializer should the array dimensions change.
“int multArr[3][2] = {{0}};” is the best way to accomplish this goal.

Can anyone explain what the problem was with the original code? It works for me...

The original poster has misunderstood the error output of his or her compiler or his or her compiler is extremely broken.
It works in Visual Studio (all versions), GCC (all versions), and whatever they use on codepad.com.
http://codepad.org/opwFC94e (for those who do not know it compiles and runs the code, and compile errors are listed, if any (see this version: http://codepad.org/eusvaaHZ))

L. Spiro

Edited by L. Spiro, 01 April 2014 - 03:30 AM.

### #8gasto  Members

Posted 01 April 2014 - 08:09 AM

The original poster has misunderstood the error output of his or her compile

You must be kidding me.

I know that one dimensional arrays initialize to 0 once at least one value is set, but I thought N dimensional array initialization had some quirks, like many things in C++.

Edited by gasto, 01 April 2014 - 08:10 AM.

Intel Core 2 Quad CPU Q6600, 2.4 GHz. 3GB RAM. ATI Radeon HD 3400.

### #9TheComet  Members

Posted 01 April 2014 - 08:45 AM

Can you post the error output you're getting?

"I would try to find halo source code by bungie best fps engine ever created, u see why call of duty loses speed due to its detail." -- GettingNifty

### #10NotYourAverageUser  Members

Posted 01 April 2014 - 09:18 AM

Meaning that if you would initialise like this:

int multArr[3][2] = { 1 };

You would set the first value to 1, and the values that are lacking will be set to 0.

Correct.  Just try it and ye shall see.  Though the OP explicitly asks why he can't...

simply initialize to zeroes a C multidimensional array as one would normally initialize a one dimensional array:

int arr[3]= {0}; / *yep.*/
int multArr[3][2] = {{0}}; /* nicht! */


Not sure what is not working for him as he has not mentioned what error he gets or how it is not working.

### #11L. Spiro  Members

Posted 01 April 2014 - 10:03 AM

but I thought N dimensional array initialization had some quirks

So you didn’t actually get an error. You just thought you would. Or-?

L. Spiro

### #12Vortez  Members

Posted 01 April 2014 - 02:15 PM

Im surprise no one said ZeroMemory or memset. I know, i know, that's old school and ZeroMemory is not portable i think, but it work, no?

### #13L. Spiro  Members

Posted 01 April 2014 - 03:02 PM

Im surprise no one said ZeroMemory or memset. I know, i know, that's old school and ZeroMemory is not portable i think, but it work, no?

Samurai Jack mentioned memset(), and no, ZeroMemory() (which is a macro) is not portable.  But since it is a macro it is trivial enough to define on any other platform.

L. Spiro

Edited by L. Spiro, 01 April 2014 - 07:46 PM.

### #14Chris_F  Members

Posted 01 April 2014 - 05:23 PM

This compiles but it in terms of correctness, “int multArr[3][2] = {{0}};” is better.

What's better about it? Correct code is correct code, and the first example is shorter while being very concise about its intent.

int multArr[3][2] = {0}; for C

int multArr[3][2] = {}; for C++


Edited by Chris_F, 01 April 2014 - 05:24 PM.

### #15Pink Horror  Members

Posted 01 April 2014 - 07:20 PM

I know that one dimensional arrays initialize to 0 once at least one value is set, but I thought N dimensional array initialization had some quirks, like many things in C++.

Your topic says "C array". Are you using C, or C++?

Edited by Pink Horror, 01 April 2014 - 07:21 PM.

### #16L. Spiro  Members

Posted 01 April 2014 - 07:45 PM

POPULAR

Correct code is correct code, and the first example is shorter while being very concise about its intent.

Code that compiles is technically immediately “correct”; that doesn’t mean it can’t be made “better”.

“int multArr[3][2] = {0};” may be shorter, but “int multArr[3][2] = {{0}};” matches the actual definition and is consistent with what you would have to do (barring {}) in the following case:

typedef enum {
Meters
} Unit;
typedef struct {
Unit uUnits;
} MyUnits;

static MyUnits g_muUnitsArray[3][2] = { Radians }; /* Error */
typedef enum {
Meters
} Unit;
typedef struct {
Unit uUnits;
} MyUnits;

static MyUnits g_muUnitsArray[3][2] = { { Radians } }; /* No error */

I will choose consistency over saving a few characters any day. It’s not clear and concise when this bit is formatted this way and that bit is formatted another way. Consistency makes concise far more than a few dropped characters.

L. Spiro

Edited by L. Spiro, 02 April 2014 - 12:08 AM.

### #17gasto  Members

Posted 02 April 2014 - 04:28 PM

According to C primer Plus by Stephen Prata, in the multidimensional array section:

int multArr[3][2] = {{0}}; /* nicht! */


only the first row would be initialized to 0.

Yes, I know it is C, but I am wondering if it also applies for C++.

Whether it compiles or not in one or two compilers does not ensure that it is standard compliant.

Intel Core 2 Quad CPU Q6600, 2.4 GHz. 3GB RAM. ATI Radeon HD 3400.

Posted 02 April 2014 - 04:43 PM

If you're using C++ I'd be tempted to go for this syntax as it covers all cases:

int multArr[3][2] = {};

### #19L. Spiro  Members

Posted 02 April 2014 - 05:11 PM

According to C primer Plus by Stephen Prata, in the multidimensional array section:

int multArr[3][2] = {{0}}; /* nicht! */


only the first row would be initialized to 0.

Yes, I know it is C, but I am wondering if it also applies for C++.

Whether it compiles or not in one or two compilers does not ensure that it is standard compliant.

It behaves the same in C and in C++: All values not explicitly set to 0 will be throughout the entirety of the array.

L. Spiro

### #20Pink Horror  Members

Posted 04 April 2014 - 10:15 AM

According to C primer Plus by Stephen Prata, in the multidimensional array section:

I do not have C Primer Plus. I do have access to the publically available C standards. I'm looking at this right now:

http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf

In section 6.7.8, starting with 26, there are many examples of partially initializing multidimensional arrays. Here's item 26:

EXAMPLE 3 The declaration
int y[4][3] = {
{ 1, 3,5},
{ 2, 4,6},
{ 3, 5,7},
};
is a deﬁnition with a fully bracketed initialization: 1, 3, and 5 initialize the ﬁrst row of y (the array object
y[0]), namely y[0][0], y[0][1], and y[0][2]. Likewise the next two lines initialize y[1] and
y[2]. The initializer ends early, so y[3] is initialized with zeros. Precisely the same effect could have
been achieved by
int y[4][3] = {
1, 3, 5, 2, 4, 6, 3, 5, 7
};
The initializer for y[0] does not begin with a left brace, so three items from the list are used. Likewise the
next three are taken successively for y[1] and y[2].

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.