473,416 Members | 1,674 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,416 software developers and data experts.

Is this type of char array initization legal?

the code below will compile in visual c++ 2003, but im not sure its
valid.

unsigned char myString[200] = "";

after this line executes, all the bytes within myString are indeed set
to '0's' but is this really valid c++ or c? where can I find out how
this is implemented?

Im concerned because I had a 3rd party library wrapper which was
crashing, and I was able to alleviate the crash by changing the
initialization method from the above to ...

unsigned char myString[200];

memset( myString, 0, sizeof( myString ) );

any guidance is greatly appreciated!
-Velik
Oct 24 '08 #1
24 2144
Do******@gmail.com wrote:
the code below will compile in visual c++ 2003, but im not sure its
valid.

unsigned char myString[200] = "";

after this line executes, all the bytes within myString are indeed set
to '0's' but is this really valid c++ or c? where can I find out how
this is implemented?

Im concerned because I had a 3rd party library wrapper which was
crashing, and I was able to alleviate the crash by changing the
initialization method from the above to ...

unsigned char myString[200];

memset( myString, 0, sizeof( myString ) );

any guidance is greatly appreciated!
-Velik
It is valid. Allowed explicitly by the Standard, subclause 8.5.2.

The only reason it could be crashing is if the compiler wastn't
providing proper initialisation for the array. What you could do is
revert this to what it was and put an assertion to see if it's indeed
the problem:

unsigned char myString[200] = "";
#ifndef NDEBUG
for (int iii = 0; iii < 200; ++iii)
ASSERT(myString[iii] == 0);
#endif

Now, if you are saying that you verified that all elements of the array
are indeed set to 0 after the initialisation, then it's OK, and the
crash is due to some other problem which you just *hid* by introducing
your 'memset' "fix", most likely.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Oct 24 '08 #2
On 2008-10-24 12:22:09 -0400, Do******@gmail.com said:
the code below will compile in visual c++ 2003, but im not sure its
valid.

unsigned char myString[200] = "";

after this line executes, all the bytes within myString are indeed set
to '0's' but is this really valid c++ or c? where can I find out how
this is implemented?
They're set to zero if myString has static storage duration, and that's
also true with no initializer. If it has automatic storage duration,
myString[0] is set to 0.
>
Im concerned because I had a 3rd party library wrapper which was
crashing, and I was able to alleviate the crash by changing the
initialization method from the above to ...

unsigned char myString[200];

memset( myString, 0, sizeof( myString ) );

any guidance is greatly appreciated!
Apparently the third-party library requires an array with all elements
set to zero. That requirement should be in the documentation for the
library.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Oct 24 '08 #3
Do******@gmail.com wrote:
the code below will compile in visual c++ 2003, but im not sure its
valid.

unsigned char myString[200] = "";

after this line executes, all the bytes within myString are indeed set
to '0's' but is this really valid c++ or c? where can I find out how
this is implemented?

Im concerned because I had a 3rd party library wrapper which was
crashing, and I was able to alleviate the crash by changing the
initialization method from the above to ...

unsigned char myString[200];

memset( myString, 0, sizeof( myString ) );

any guidance is greatly appreciated!
Practical advice: change it to

unsigned char myString[ 200 ] = {} ;

What to you mean by "alleviate" the crash?

PS: the language lawyering behind the first initialization is a
bit more complicated than I have time to explain; consider that
the array elements are of type unsigned char (not char) and that
there was a C standard clarification in this area which C++
hasn't picked up (though your C++ compiler might de-facto
implement it).

<http://groups.google.com/group/comp.lang.c++/msg/d5ac14fbe55de25b>

--
Gennaro Prota | name.surname yahoo.com
Breeze C++ (preview): <https://sourceforge.net/projects/breeze/>
Do you need expertise in C++? I'm available.
Oct 24 '08 #4
On 2008-10-24 12:49:25 -0400, Victor Bazarov <v.********@comAcast.netsaid:
Do******@gmail.com wrote:
>the code below will compile in visual c++ 2003, but im not sure its
valid.

unsigned char myString[200] = "";

after this line executes, all the bytes within myString are indeed set
to '0's' but is this really valid c++ or c? where can I find out how
this is implemented?

Im concerned because I had a 3rd party library wrapper which was
crashing, and I was able to alleviate the crash by changing the
initialization method from the above to ...

unsigned char myString[200];

memset( myString, 0, sizeof( myString ) );

any guidance is greatly appreciated!

It is valid. Allowed explicitly by the Standard, subclause 8.5.2.

The only reason it could be crashing is if the compiler wastn't
providing proper initialisation for the array. What you could do is
revert this to what it was and put an assertion to see if it's indeed
the problem:

unsigned char myString[200] = "";
#ifndef NDEBUG
for (int iii = 0; iii < 200; ++iii)
ASSERT(myString[iii] == 0);
#endif
Hmm, is this required if the char array has automatic storage duration?
I have always assumed that it wasn't, that only the characters
corresponding to characters in the initializer would be initialized,
but it doesn't seem completely clear from a quick glance at the
standard.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Oct 24 '08 #5
On Oct 24, 12:22*pm, DomoC...@gmail.com wrote:
the code below will compile in visual c++ 2003, but im not sure its
valid.

unsigned char myString[200] = "";

after this line executes, all the bytes within myString are indeed set
to '0's' *but is this really valid c++ or c? *where can I find out how
this is implemented?
Sounds like you see the results of a program in debug mode. The string
literal "" is actually {'\0'} so everything after myString[0] has an
undeterminate value. Nobody cares whether some compiler initializes or
not the rest of the array with some magic value, there is no
requirement that says it must.
>
Im concerned because I had a 3rd party library wrapper which was
crashing, and I was able to alleviate the crash by changing the
initialization method from the above to ...

unsigned char myString[200];

memset( myString, 0, sizeof( myString ) );

any guidance is greatly appreciated!
-Velik
An array has a special initializer that looks like so:
unsigned char myString[200] = {'a'};
which initializes all elements with 'a' in this case.
Note the element type of the array (unsigned char) and the type in the
array init list.
Now having said that, the above is an array, not a terminated sequence
of unsigned characters.

Another reason to prefer modern containers:

#include <vector>

// all elements initialized: guarenteed
std::vector< unsigned char vuc(200);

// all 'a'
std::vector< unsigned char vuca(200, 'a');
Oct 24 '08 #6
On 2008-10-24 13:35:25 -0400, Salt_Peter <pj*****@yahoo.comsaid:
On Oct 24, 12:22Â*pm, DomoC...@gmail.com wrote:
>the code below will compile in visual c++ 2003, but im not sure its
valid.

unsigned char myString[200] = "";

after this line executes, all the bytes within myString are indeed set
to '0's' Â*but is this really valid c++ or c? Â*where can I find out ho
w
>this is implemented?

Sounds like you see the results of a program in debug mode.
In which case, the debug mode needs further thought. Initializing to
all zeros is a bad idea when debugging, because the result looks like
good data.
The string
literal "" is actually {'\0'} so everything after myString[0] has an
undeterminate value. Nobody cares whether some compiler initializes or
not the rest of the array with some magic value, there is no
requirement that says it must.
>>
Im concerned because I had a 3rd party library wrapper which was
crashing, and I was able to alleviate the crash by changing the
initialization method from the above to ...

unsigned char myString[200];

memset( myString, 0, sizeof( myString ) );

any guidance is greatly appreciated!
-Velik

An array has a special initializer that looks like so:
unsigned char myString[200] = {'a'};
which initializes all elements with 'a' in this case.
This is just straight aggregate initialization, and it initializes all
values after the end of the initializer to 0, not to the value of the
initializer.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Oct 24 '08 #7
Pete Becker wrote:
On 2008-10-24 12:49:25 -0400, Victor Bazarov <v.********@comAcast.net>
said:
>Do******@gmail.com wrote:
>>the code below will compile in visual c++ 2003, but im not sure its
valid.

unsigned char myString[200] = "";

after this line executes, all the bytes within myString are indeed set
to '0's' but is this really valid c++ or c? where can I find out how
this is implemented?

Im concerned because I had a 3rd party library wrapper which was
crashing, and I was able to alleviate the crash by changing the
initialization method from the above to ...

unsigned char myString[200];

memset( myString, 0, sizeof( myString ) );

any guidance is greatly appreciated!

It is valid. Allowed explicitly by the Standard, subclause 8.5.2.

The only reason it could be crashing is if the compiler wastn't
providing proper initialisation for the array. What you could do is
revert this to what it was and put an assertion to see if it's indeed
the problem:

unsigned char myString[200] = "";
#ifndef NDEBUG
for (int iii = 0; iii < 200; ++iii)
ASSERT(myString[iii] == 0);
#endif

Hmm, is this required if the char array has automatic storage duration?
I have always assumed that it wasn't, that only the characters
corresponding to characters in the initializer would be initialized, but
it doesn't seem completely clear from a quick glance at the standard.
8.5.1/7:
<<If there are fewer initializers in the list than there are members in
the aggregate, then each member not
explicitly initialized shall be value-initialized (8.5).>>

To me it's pretty clear. Each character from the literal initialises
its respective element of the array. The terminating null character
does initialise the corresponding element of the array *too*. If there
are fewer characters in the literal than elements in the array (which is
an aggregate), the rest of the array elements are zero-initialised.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Oct 24 '08 #8
Pete Becker wrote:
On 2008-10-24 12:49:25 -0400, Victor Bazarov
<v.********@comAcast.netsaid:
The only reason it could be crashing is if the compiler wastn't
providing proper initialisation for the array. What you could do
is revert this to what it was and put an assertion to see if it's
indeed the problem:

unsigned char myString[200] = "";
#ifndef NDEBUG
for (int iii = 0; iii < 200; ++iii)
ASSERT(myString[iii] == 0);
#endif

Hmm, is this required if the char array has automatic storage
duration? I have always assumed that it wasn't, that only the
characters corresponding to characters in the initializer would be
initialized, but it doesn't seem completely clear from a quick glance
at the standard.
Interesting. I also didn't find anything explicit regarding string
literals, just the usual "fewer initializer" rule:

If there are fewer initializers in the list than there are
members in the aggregate, then each member not explicitly
initialized shall be value-initialized (8.5).

The C standard does contain such wording (assuming that it didn't
change from the draft standard):

[#21] If there are fewer initializers in a brace-enclosed
list than there are elements or members of an aggregate, or
fewer characters in a string literal used to initialize an
array of known size than there are elements in the array,
the remainder of the aggregate shall be initialized
implicitly the same as objects that have static storage
duration.

C89's wording was similar to the C++ standard, but had further examples
to show that initialization with a string literal is identical to a
brace-enclosed list of the characters, which would amount to the same
thing.


Brian

Oct 24 '08 #9
On 2008-10-24 16:18:56 -0400, Victor Bazarov <v.********@comAcast.netsaid:
Pete Becker wrote:
>On 2008-10-24 12:49:25 -0400, Victor Bazarov <v.********@comAcast.netsaid:
>>Do******@gmail.com wrote:
the code below will compile in visual c++ 2003, but im not sure its
valid.

unsigned char myString[200] = "";

after this line executes, all the bytes within myString are indeed set
to '0's' but is this really valid c++ or c? where can I find out how
this is implemented?

Im concerned because I had a 3rd party library wrapper which was
crashing, and I was able to alleviate the crash by changing the
initialization method from the above to ...

unsigned char myString[200];

memset( myString, 0, sizeof( myString ) );

any guidance is greatly appreciated!

It is valid. Allowed explicitly by the Standard, subclause 8.5.2.

The only reason it could be crashing is if the compiler wastn't
providing proper initialisation for the array. What you could do is
revert this to what it was and put an assertion to see if it's indeed
the problem:

unsigned char myString[200] = "";
#ifndef NDEBUG
for (int iii = 0; iii < 200; ++iii)
ASSERT(myString[iii] == 0);
#endif

Hmm, is this required if the char array has automatic storage duration?
I have always assumed that it wasn't, that only the characters
corresponding to characters in the initializer would be initialized,
but it doesn't seem completely clear from a quick glance at the
standard.

8.5.1/7:
<<If there are fewer initializers in the list than there are members in
the aggregate, then each member not
explicitly initialized shall be value-initialized (8.5).>>
Well, yes, that's the requirement for aggregate initialization. But
does aggregate initialization apply here? Aggregate initialization is
indicated by "a brace-enclosed, comma-separated list ...", which isn't
present here. I don't see anything in 8.5.2 [dcl.init.string] that says
that aggregate initialization is used, although the "optionally
enclosed in braces" hints that it may be.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Oct 24 '08 #10
On 2008-10-24 16:29:45 -0400, "Default User" <de***********@yahoo.comsaid:
Pete Becker wrote:
>On 2008-10-24 12:49:25 -0400, Victor Bazarov
<v.********@comAcast.netsaid:
>>The only reason it could be crashing is if the compiler wastn't
providing proper initialisation for the array. What you could do
is revert this to what it was and put an assertion to see if it's
indeed the problem:

unsigned char myString[200] = "";
#ifndef NDEBUG
for (int iii = 0; iii < 200; ++iii)
ASSERT(myString[iii] == 0);
#endif

Hmm, is this required if the char array has automatic storage
duration? I have always assumed that it wasn't, that only the
characters corresponding to characters in the initializer would be
initialized, but it doesn't seem completely clear from a quick glance
at the standard.

Interesting. I also didn't find anything explicit regarding string
literals, just the usual "fewer initializer" rule:

If there are fewer initializers in the list than there are
members in the aggregate, then each member not explicitly
initialized shall be value-initialized (8.5).

The C standard does contain such wording (assuming that it didn't
change from the draft standard):

[#21] If there are fewer initializers in a brace-enclosed
list than there are elements or members of an aggregate, or
fewer characters in a string literal used to initialize an
array of known size than there are elements in the array,
the remainder of the aggregate shall be initialized
implicitly the same as objects that have static storage
duration.

C89's wording was similar to the C++ standard, but had further examples
to show that initialization with a string literal is identical to a
brace-enclosed list of the characters, which would amount to the same
thing.
So C99 made it crystal clear, presumably because C90 wasn't. <g>

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Oct 24 '08 #11
Victor Bazarov wrote:
Pete Becker wrote:
On 2008-10-24 12:49:25 -0400, Victor Bazarov
Hmm, is this required if the char array has automatic storage
duration? I have always assumed that it wasn't, that only the
characters corresponding to characters in the initializer would be
initialized, but it doesn't seem completely clear from a quick
glance at the standard.

8.5.1/7:
<<If there are fewer initializers in the list than there are members
in the aggregate, then each member not explicitly initialized shall
be value-initialized (8.5).>>

To me it's pretty clear. Each character from the literal initialises
its respective element of the array. The terminating null character
does initialise the corresponding element of the array too. If there
are fewer characters in the literal than elements in the array (which
is an aggregate), the rest of the array elements are zero-initialised.
I'm sure it was intended, and it's always been that way in C, but
there's some haziness. A string literal isn't a list, exactly. As I
pointed out in another reply, the C99 standard added wording to make
that explicit, and the older standard had wording that confirmed that a
string literal was the same as a character list for intialization
purposes.

In my experience, a C++ compiler that didn't zero out the rest of the
array would be unusual. The OP can certainly check to see if that's the
problem.

Brian
Oct 24 '08 #12
On Oct 24, 10:46*pm, Pete Becker <p...@versatilecoding.com>
wrote:
On 2008-10-24 16:18:56 -0400, Victor Bazarov
<v.Abaza...@comAcast.netsaid:
8.5.1/7:
<<If there are fewer initializers in the list than there are members in
the aggregate, then each member not
explicitly initialized shall be value-initialized (8.5).>>
Well, yes, that's the requirement for aggregate
initialization. But does aggregate initialization apply here?
Aggregate initialization is indicated by "a brace-enclosed,
comma-separated list ...", which isn't present here. I don't
see anything in 8.5.2 [dcl.init.string] that says that
aggregate initialization is used, although the "optionally
enclosed in braces" hints that it may be.
Well, I rather think it was intended, although you do have a
point. Probably a defect in the standard. (Maybe I should
raise an issue. I'd love to say that it was just editorial, and
just push it off on you, but I think it's a little too much for
that.)

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Oct 24 '08 #13
Pete Becker wrote:
On 2008-10-24 16:29:45 -0400, "Default User"
<de***********@yahoo.comsaid:
C89's wording was similar to the C++ standard, but had further
examples to show that initialization with a string literal is
identical to a brace-enclosed list of the characters, which would
amount to the same thing.

So C99 made it crystal clear, presumably because C90 wasn't. <g>
It was, I think, clear enough. It just wasn't all put together nicely.
They had examples to show that:

char str[] = "XYZ";

Was equivalent to:

char str[] = {'X', 'Y', 'Z', '\0'};

So if a string literal is equivalent to a brace-enclosed list of
characters, then the "fewer initializer" rule would come into play to
finish out an array larger than the string literal with '\0'.


Brian
Oct 24 '08 #14
On 2008-10-24 17:17:10 -0400, "Default User" <de***********@yahoo.comsaid:
Pete Becker wrote:
>On 2008-10-24 16:29:45 -0400, "Default User"
<de***********@yahoo.comsaid:
>>C89's wording was similar to the C++ standard, but had further
examples to show that initialization with a string literal is
identical to a brace-enclosed list of the characters, which would
amount to the same thing.

So C99 made it crystal clear, presumably because C90 wasn't. <g>

It was, I think, clear enough. It just wasn't all put together nicely.
They had examples to show that:

char str[] = "XYZ";

Was equivalent to:

char str[] = {'X', 'Y', 'Z', '\0'};

So if a string literal is equivalent to a brace-enclosed list of
characters, then the "fewer initializer" rule would come into play to
finish out an array larger than the string literal with '\0'.
Examples in standards are not normative. That is, they do not impose
requirements. They illustrate what the words say. If the words don't
say it, examples don't make it true.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Oct 24 '08 #15
On 2008-10-24 17:11:10 -0400, James Kanze <ja*********@gmail.comsaid:
On Oct 24, 10:46Â*pm, Pete Becker <p...@versatilecoding.com>
wrote:
>On 2008-10-24 16:18:56 -0400, Victor Bazarov
<v.Abaza...@comAcast.netsaid:
>>8.5.1/7:
<<If there are fewer initializers in the list than there are members in
the aggregate, then each member not
explicitly initialized shall be value-initialized (8.5).>>
>Well, yes, that's the requirement for aggregate
initialization. But does aggregate initialization apply here?
Aggregate initialization is indicated by "a brace-enclosed,
comma-separated list ...", which isn't present here. I don't
see anything in 8.5.2 [dcl.init.string] that says that
aggregate initialization is used, although the "optionally
enclosed in braces" hints that it may be.

Well, I rather think it was intended, although you do have a
point. Probably a defect in the standard. (Maybe I should
raise an issue. I'd love to say that it was just editorial, and
just push it off on you, but I think it's a little too much for
that.)
Me, too. <g>

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Oct 24 '08 #16
Pete Becker wrote:
Examples in standards are not normative. That is, they do not impose
requirements. They illustrate what the words say. If the words don't
say it, examples don't make it true.
The question is whether the words do say it or not. The examples
certainly help clarify the situation. On the other hand, adding
explicit wording to the next standard indicates that not everyone was
so convinced.

Brian
Oct 24 '08 #17
On 2008-10-24 17:53:48 -0400, "Default User" <de***********@yahoo.comsaid:
Pete Becker wrote:
>Examples in standards are not normative. That is, they do not impose
requirements. They illustrate what the words say. If the words don't
say it, examples don't make it true.

The question is whether the words do say it or not. The examples
certainly help clarify the situation.
No. Pretend the examples aren't there. What do the words say? If they
don't impose some particular requirement, then it's not a requirement,
even if examples imply that it is.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Oct 24 '08 #18
Pete Becker wrote:
On 2008-10-24 17:53:48 -0400, "Default User"
<de***********@yahoo.comsaid:
Pete Becker wrote:
Examples in standards are not normative. That is, they do not
impose requirements. They illustrate what the words say. If the
words don't say it, examples don't make it true.
The question is whether the words do say it or not. The examples
certainly help clarify the situation.

No. Pretend the examples aren't there. What do the words say? If they
don't impose some particular requirement, then it's not a
requirement, even if examples imply that it is.
The question is, does the requirement for filling out an array when
there is fewer elements in the initializer list than there are in the
declarared array apply when the initializer is a string literal? It
doesn't specifically say that it does, but is it a legitimate
interpretation?

Searching back in comp.std.c, I find that apparently this issue was
submitted as a Defect Report / Technical Corrigendum that "clarifies
that a string literal is equivalent to a brace-enclosed
list of characters."

So the issue has come up before there, and that report is probably why
C99 explicitly said so.

It should be noted that the C++ standard does refer to the individual
characters of a string literal as "initializers". Whether that's
sufficient or not is hard to say.

I don't have time right now to search comp.std.c++ (I'm off to the
hockey game).

Brian
Oct 24 '08 #19
In article
<79**********************************@y29g2000hsf. googlegroups.com>, James
Kanze <ja*********@gmail.comwrote:
On Oct 24, 10:46=A0pm, Pete Becker <p...@versatilecoding.com>
wrote:
On 2008-10-24 16:18:56 -0400, Victor Bazarov
<v.Abaza...@comAcast.netsaid:
8.5.1/7:
<<If there are fewer initializers in the list than there are members in
the aggregate, then each member not
explicitly initialized shall be value-initialized (8.5).>>
Well, yes, that's the requirement for aggregate
initialization. But does aggregate initialization apply here?
Aggregate initialization is indicated by "a brace-enclosed,
comma-separated list ...", which isn't present here. I don't
see anything in 8.5.2 [dcl.init.string] that says that
aggregate initialization is used, although the "optionally
enclosed in braces" hints that it may be.

Well, I rather think it was intended, although you do have a
point. Probably a defect in the standard. (Maybe I should
raise an issue. I'd love to say that it was just editorial, and
just push it off on you, but I think it's a little too much for
that.)
If it's not required, then the following would result in a[2] and a[3]
having const indeterminate values, a rather odd situation:

char const a [4] = "X";
Oct 25 '08 #20
blargg wrote:
In article
<79**********************************@y29g2000hsf. googlegroups.com>, James
Kanze <ja*********@gmail.comwrote:
>On Oct 24, 10:46=A0pm, Pete Becker <p...@versatilecoding.com>
wrote:
>>On 2008-10-24 16:18:56 -0400, Victor Bazarov
<v.Abaza...@comAcast.netsaid:
8.5.1/7:
<<If there are fewer initializers in the list than there are members in
the aggregate, then each member not
explicitly initialized shall be value-initialized (8.5).>>
Well, yes, that's the requirement for aggregate
initialization. But does aggregate initialization apply here?
Aggregate initialization is indicated by "a brace-enclosed,
comma-separated list ...", which isn't present here. I don't
see anything in 8.5.2 [dcl.init.string] that says that
aggregate initialization is used, although the "optionally
enclosed in braces" hints that it may be.
Well, I rather think it was intended, although you do have a
point. Probably a defect in the standard. (Maybe I should
raise an issue. I'd love to say that it was just editorial, and
just push it off on you, but I think it's a little too much for
that.)

If it's not required, then the following would result in a[2] and a[3]
having const indeterminate values, a rather odd situation:

char const a [4] = "X";
Not sure about the "odd" comment. The compiler that is created
following the rule that it's allowed to forgo the initialisation of the
array elements beyond the terminating null char, would probably *warn*
about the unintialised const and force using the curly brackets form:

char const a [4] = { 'X' };

which ensures that the tail is value-initialised.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Oct 25 '08 #21
On Oct 24, 11:46*pm, Pete Becker <p...@versatilecoding.comwrote:
On 2008-10-24 17:17:10 -0400, "Default User" <defaultuse...@yahoo.comsaid:
Pete Becker wrote:
On 2008-10-24 16:29:45 -0400, "Default User"
<defaultuse...@yahoo.comsaid:
>C89's wording was similar to the C++ standard, but had
further examples to show that initialization with a string
literal is identical to a brace-enclosed list of the
characters, which would amount to the same thing.
So C99 made it crystal clear, presumably because C90 wasn't. <g>
It was, I think, clear enough. It just wasn't all put
together nicely. They had examples to show that:
* *char str[] = "XYZ";
Was equivalent to:
* *char str[] = {'X', 'Y', 'Z', '\0'};
So if a string literal is equivalent to a brace-enclosed
list of characters, then the "fewer initializer" rule would
come into play to finish out an array larger than the string
literal with '\0'.
Examples in standards are not normative. That is, they do not
impose requirements. They illustrate what the words say. If
the words don't say it, examples don't make it true.
In this case, the words do say what the example shows. But it
has nothing to do with the case at hand, something like:
char str[ 20 ] = "abc" ;
Is this guaranteed to initialize all 20 bytes, or just the first
four?

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Oct 25 '08 #22
On 2008-10-24 19:21:26 -0400, "Default User" <de***********@yahoo.comsaid:
>
Searching back in comp.std.c, I find that apparently this issue was
submitted as a Defect Report / Technical Corrigendum that "clarifies
that a string literal is equivalent to a brace-enclosed
list of characters."

So the issue has come up before there, and that report is probably why
C99 explicitly said so.
Sigh. That's what I said several messages back. C99 changed the wording
because the C90 words weren't clear.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Oct 25 '08 #23
Pete Becker wrote:
On 2008-10-24 19:21:26 -0400, "Default User"
<de***********@yahoo.comsaid:

Searching back in comp.std.c, I find that apparently this issue was
submitted as a Defect Report / Technical Corrigendum that "clarifies
that a string literal is equivalent to a brace-enclosed
list of characters."

So the issue has come up before there, and that report is probably
why C99 explicitly said so.

Sigh. That's what I said several messages back. C99 changed the
wording because the C90 words weren't clear.
You mentioned nothing about this defect report. My research was to add
to the previous discussion, not to refute anything.


Brian

--
If televison's a babysitter, the Internet is a drunk librarian who
won't shut up.
-- Dorothy Gambrell (http://catandgirl.com)
Oct 25 '08 #24
On Oct 24, 10:47*pm, Pete Becker <p...@versatilecoding.comwrote:
On 2008-10-24 17:11:10 -0400, James Kanze <james.ka...@gmail.comsaid:
On Oct 24, 10:46*pm, Pete Becker <p...@versatilecoding.com>
wrote:
On 2008-10-24 16:18:56 -0400, Victor Bazarov
<v.Abaza...@comAcast.netsaid:
8.5.1/7:
<<If there are fewer initializers in the list than there are members in
the aggregate, then each member not
explicitly initialized shall be value-initialized (8.5).>>
Well, yes, that's the requirement for aggregate
initialization. But does aggregate initialization apply
here? Aggregate initialization is indicated by "a
brace-enclosed, comma-separated list ...", which isn't
present here. I don't see anything in 8.5.2
[dcl.init.string] that says that aggregate initialization
is used, although the "optionally enclosed in braces" hints
that it may be.
Well, I rather think it was intended, although you do have a
point. *Probably a defect in the standard. *(Maybe I should
raise an issue. *I'd love to say that it was just editorial,
and just push it off on you, but I think it's a little too
much for that.)
Me, too. <g>
Done. I've raised the issue with the committee.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Oct 26 '08 #25

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Jonathan Turkanis | last post by:
Can the syntax for function types be used within a function type declaration as a synonym for the corresponding pointer-to-function type? For instance, is int(char(long)) a valid type...
30
by: Tim Johansson | last post by:
I'm new to C++, and tried to start making a script that will shuffle an array. Can someone please tell me what's wrong? #include <iostream.h> #include <string.h> int main () {...
21
by: Nitin Bhardwaj | last post by:
Hi all, It is said that C++ is a strongly typed language and thus a type-safe language (unlike C). So how does one explain the following behaviour : int main(void) { char *p = NULL; p = "A...
7
by: __PPS__ | last post by:
Actually what I mean is that - if I have some memory buffer, lets say char a; and then I do like this: DWORD num = 0x1234; *(DWORD*)a = num; (1) *(DWORD*)(a+1) = num; (2) either...
4
by: Andrew K | last post by:
Hello, I have run into a problem with VC7 that worked in VC6. These two sections should be exactly the same... class test { public: virtual void blah(void)=0;}; void func(test) {} and
51
by: Pedro Graca | last post by:
I run into a strange warning (for me) today (I was trying to improve the score of the UVA #10018 Programming Challenge). $ gcc -W -Wall -std=c89 -pedantic -O2 10018-clc.c -o 10018-clc...
33
by: Mark P | last post by:
A colleague asked me something along the lines of the following today. For some type X he has: X* px = new X; Then he wants to convert px to a char* (I'm guessing for the purpose of...
3
by: somenath | last post by:
Hi All, I got some questions regarding the type of expression . For example 1)char *const *(*ptr)(); Here the type of ptr is it is constant pointer to a function which accept unspecified...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.