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

Started by
18 comments, last by Pink Horror 10 years ago

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

I restore Nintendo 64 video-game OST’s into HD! https://www.youtube.com/channel/UCCtX_wedtZ5BoyQBXEhnVZw/playlists?view=1&sort=lad&flow=grid

Advertisement

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

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

I restore Nintendo 64 video-game OST’s into HD! https://www.youtube.com/channel/UCCtX_wedtZ5BoyQBXEhnVZw/playlists?view=1&sort=lad&flow=grid


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++

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++?

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 {
    Radians,
    Meters
} Unit;
typedef struct {
    Unit uUnits;
} MyUnits;

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

typedef enum {
    Radians,
    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

I restore Nintendo 64 video-game OST’s into HD! https://www.youtube.com/channel/UCCtX_wedtZ5BoyQBXEhnVZw/playlists?view=1&sort=lad&flow=grid

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.

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


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


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

I restore Nintendo 64 video-game OST’s into HD! https://www.youtube.com/channel/UCCtX_wedtZ5BoyQBXEhnVZw/playlists?view=1&sort=lad&flow=grid

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

This topic is closed to new replies.

Advertisement