I read a question on the difference between:
const char*
and
const char[]
where as for a while, I though arrays were just syntactic sugar for pointers. But something is bugging me, I have a pice of code similar to the following:
namespace SomeNamespace {
const char* str = { 'b', 'l', 'a', 'h' };
}
I get, error: scaler object 'str' requires one element in initializer. So, I tried this:
namespace SomeNamespace {
const char str[] = { 'b', 'l', 'a', 'h' };
}
It worked, at first I thought this may have to do with the fact that an extra operation is applied when it is a const char*, and GCC is never a fan of operations being performed outside a function (which is bad practice anyway), but the error does not seem to suggest so. However in:
void Func() {
const char* str = { 'b', 'l', 'a', 'h' };
}
It compiles just fine as expected. Does anyone have any idea why this is so?
x86_64/i686-nacl-gcc 4(.1.4?) pepper 19 tool - chain (basically GCC).
First off, it doesn't make a difference if you try to use compound initialization at namespace scope or in a function: neither should work! When you write
you got a pointer to a sequence of
char
s which can, e.g., be initialized with a string literal. In any case, thechar
s are located somewhere else than the pointer. On the other hand, when you writeYou define an array of
char
s. The size of the array is determined by the number of elements on the right side and, e.g., becomes 4 your example{ 'b', 'l', 'a', 'h' }
. If you used, e.g.,"blah"
instead the size would, of course, be 5. The elements of the array are copied into the location wherestr
is defined in this case.Note that
char const x[]
can be equivalent to writingchar const* x
in some contexts: when you declare a function argument,char const x[]
actually is the same aschar const*
.