• Advertisement
Sign in to follow this  

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

This topic is 1390 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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! */

Share this post


Link to post
Share on other sites
Advertisement

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites


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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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? :)

Share this post


Link to post
Share on other sites

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? smile.png

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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].

 

 

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement