Initializing arrays of char
Chris Torek
chris at mimsy.umd.edu
Sat Oct 6 00:21:41 AEST 1990
In article <15674 at csli.Stanford.EDU> poser at csli.Stanford.EDU
(Bill Poser) writes:
>Regarding the assignment of "12345" to char x[5] ... [K&R 2 says]
> ...the number of characters in the string, NOT COUNTING
> THE TERMINATING NULL CHARACTER, must not exceed the
> size of the array. [emphasis mine]
>Can anyone explain [why the ending '\0' is not counted]?
This is a change in New (ANSI) C. In Classic (K&R-1) C, a
double-quoted string in an initializer context%, when setting the
initial value of a character array, was treated uniformly as if it were
a bracketed initializer consisting of all the characters, including
the terminating NUL, in the string. That is,
char x[5] = "12345";
meant exactly the same thing as
char x[5] = { '1', '2', '3', '4', '5', '\0' };
(and was therefore in error, having too many characters).
The X3J11 committee decided# that this was overly restrictive, and
relaxed the rule to `is equivalent to a bracketed initializer
consisting of all the characters, including the terminating NUL if it
fits'. Thus
char x[] = "12345";
means the same as
char x[] = { '1', '2', '3', '4', '5', '\0' };
or
char x[6] = { '1', '2', '3', '4', '5', '\0' };
but
char x[5] = "12345";
now means the same as
char x[5] = { '1', '2', '3', '4', '5' };
If the declaration is changed to
char x[4] = "12345";
it is once again in error.
-----
% Note that here (in an initializer context) and as an argument to
sizeof (e.g., `sizeof "abc"') are the only two places that a double
quoted string does not undergo the usual `array degenerates into
pointer' rule. All other legal occurrences of a double-quoted string
are in a value context, and therefore change from `array N of char'
to `pointer to char', pointing to the first character in the string.
# This wording is not meant to imply judgement as to this decision.
(When I do not take a stand on some aspect of the language I use
weasel-wording like `seems to be' or merely present bare facts.)
Since I use old compilers, I have not made up my mind on this. I
am leaning towards the `not a bad idea after all' faction.
--
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 405 2750)
Domain: chris at cs.umd.edu Path: uunet!mimsy!chris
More information about the Comp.lang.c
mailing list