I was reading a thread titled "strlen vs sizeof" on CodeGuru, and one of the replies states that "it's anyways [sic] bad practice to initialie [sic] a char
array with a string literal."
Is this true, or is that just his (albeit an "elite member") opinion?
Here is the original question:
#include <stdio.h>
#include<string.h>
main()
{
char string[] = "october";
strcpy(string, "september");
printf("the size of %s is %d and the length is %d\n\n", string, sizeof(string), strlen(string));
return 0;
}
right. the size should be the length plus 1 yes?
this is the output
the size of september is 8 and the length is 9
size should be 10 surely. its like its calculating the sizeof string before it is changed by strcpy but the length after.
Is there something wrong with my syntax or what?
Here is the reply:
It's anyways bad practice to initialie a char array with a string literal. So always do one of the following:
const char string1[] = "october";
char string2[20]; strcpy(string2, "september");
Best Answer
The author of that comment never really justifies it, and I find the statement puzzling.
In C (and you've tagged this as C), that's pretty much the only way to initialize an array of
char
with a string value (initialization is different from assignment). You can write eitheror
or
In the first case, the size of the array is taken from the size of the initializer. String literals are stored as arrays of
char
with a terminating 0 byte, so the size of the array is 8 ('o', 'c', 't', 'o', 'b', 'e', 'r', 0). In the second two cases, the size of the array is specified as part of the declaration (8 andMAX_MONTH_LENGTH
, whatever that happens to be).What you cannot do is write something like
or
etc. In the first case, the declaration of
string
is incomplete because no array size has been specified and there's no initializer to take the size from. In both cases, the=
won't work because a) an array expression such asstring
may not be the target of an assignment and b) the=
operator isn't defined to copy the contents of one array to another anyway.By that same token, you can't write
where
foo
is another array ofchar
. This form of initialization will only work with string literals.EDIT
I should amend this to say that you can also initialize arrays to hold a string with an array-style initializer, like
or
but it's easier on the eyes to use string literals.
EDIT2
In order to assign the contents of an array outside of a declaration, you would need to use either
strcpy/strncpy
(for 0-terminated strings) ormemcpy
(for any other type of array):or