473,416 Members | 1,974 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.

Character array Initialization

Hi,

I have question about character array initialization. In section 6.7.8
paragraph number 21, it's given that

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

My question is that, if I declare

char sTemp[5] = "";

Is it GUARANTEED that all the five elements of the array will be
initialized to '\0'? Or is it only guarantees that that sTemp[0] will
be initialized to '\0'?

Any help greatly appreciated.

Thank you for your time.

-Kannan

Sep 9 '06 #1
6 34749
"Kannan" <ri*******@gmail.comwrites:
Hi,

I have question about character array initialization. In section 6.7.8
paragraph number 21, it's given that

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

My question is that, if I declare

char sTemp[5] = "";

Is it GUARANTEED that all the five elements of the array will be
initialized to '\0'? Or is it only guarantees that that sTemp[0] will
be initialized to '\0'?
It certainly looks like it's guaranteed. The paragraph you quoted
refers specifically to astring literal used to initialize an array of
known size.

Why would you suspect that it isn't guaranteed?

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Sep 9 '06 #2
Hello Kannan:

Sorry to add another question to yours... (see below)

Kannan wrote:
Hi,

I have question about character array initialization. In section 6.7.8
paragraph number 21, it's given that

"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."
Does anybody know if the standard behavior is scope-specific? To
further clarify, is it portable to assume this:

/* Begin Program */
char Extern_sTemp[5] = ""; // all elements are null right?
static char Static_sTemp[5] = ""; // ditto?

int main( void )
{
char Auto_sTemp[5] = ""; // same here?
return 0;
}
/* End Program */
>
My question is that, if I declare

char sTemp[5] = "";

Is it GUARANTEED that all the five elements of the array will be
initialized to '\0'? Or is it only guarantees that that sTemp[0] will
be initialized to '\0'?
For lack of a copy of the C standard (yes I should buy it) I have coded
around this problem in my production code by using memset() or the like
to initialize the appropriate memory to a "known" default value (like
'\0', or 0, or NULL) -- whichever you prefer). Usually it would look
like this:

#define STEMP_MAXSIZE 5
....
char sTemp[ STEMP_MAXSIZE ];
memset( sTemp, 0, STEMP_MAXSIZE); // my preferred way of doing it
....

/* OR */

char sTemp[5];
memset( sTemp, 0, sizeof(sTemp) ); // I like this version less

Any help greatly appreciated.

Thank you for your time.

-Kannan
I really like the interesting point you bring up. I have looked for a
way of using memset() less to initialize contiguous areas of memory.

Below is a link to an article describing how such a simple use of
memset() can get ugly:

"Security Enhancements" (note: this article has a C++ bias)
http://www.informit.com/guides/conte...eqNum=202&rl=1

-Randall
Sr. Software Engineer
Lockheed Martin

Sep 9 '06 #3
Randall wrote:
Does anybody know if the standard behavior is scope-specific? To
further clarify, is it portable to assume this:

/* Begin Program */
char Extern_sTemp[5] = ""; // all elements are null right?
All 5 elements have value zero. They are null characters.
static char Static_sTemp[5] = ""; // ditto?
Yes, initialised to exactly the same values.
int main( void )
{
char Auto_sTemp[5] = ""; // same here?
Yes, initialised to exactly the same values.
return 0;
}
/* End Program */
If there is an initialiser present, then the initialiser has the same
meaning no matter what the scope, storage type and linkage type.

If there is no initialiser, then the behaviour depends on the storage
type. Objects with static storage (including extern and static linkage,
and in any scope) are initialised to zeros, but objects with automatic
storage are not initialised and have indeterminate values.

char ExternLinkage_StaticStorage_FileScope[5];

static char NoLinkage_StaticStorage_FileScope[5];

void foo(void)
{
static char NoLinkage_StaticStorage_BlockScope[5];

char NoLinkage_AutomaticStorage_BlockScope[5];
}

Of these four definitions, the first three all have static storage, and
so they are automatically initialised to zeros. The last one has
automatic storage, and so it is not automatically initialised.

--
Simon.
Sep 9 '06 #4
Randall wrote:
<snipped>
#define STEMP_MAXSIZE 5
....
char sTemp[ STEMP_MAXSIZE ];
memset( sTemp, 0, STEMP_MAXSIZE); // my preferred way of doing it
....

/* OR */

char sTemp[5];
memset( sTemp, 0, sizeof(sTemp) ); // I like this version less

Your preferred way is prone to bugs when the
inevitable maintenance comes around 5 years
after you left the organisation.

My preferred way is:
memset (sTemp, 0, sizeof sTemp);

Using sizeof with unnecessary parentheses tends
to either tell the maintenance programmer that
sTemp is a typedef *OR* tell the beginner programmer
that sizeof is a function call.

But hey, different strokes ...

<snipped>

--
goose
Have I offended you? Send flames to root@localhost
real email: lelanthran at gmail dot com
website : www.lelanthran.com
Sep 9 '06 #5
Randall wrote:

[snip]
For lack of a copy of the C standard (yes I should buy it)
Or you can download the free post-Standard draft which is essentially
the C99 Standard plus TC1 and TC2:
<www.open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf>

Robert Gamble

Sep 9 '06 #6

Keith Thompson wrote:
"Kannan" <ri*******@gmail.comwrites:

Is it GUARANTEED that all the five elements of the array will be
initialized to '\0'? Or is it only guarantees that that sTemp[0] will
be initialized to '\0'?

It certainly looks like it's guaranteed. The paragraph you quoted
refers specifically to astring literal used to initialize an array of
known size.

Why would you suspect that it isn't guaranteed?
Hmm , this actually does come as a big surprise to me. And since you
asked, the reason is that it seems to be an unnecessary waste of
runtime. If for some bizarre reason I insist on having the whole array
of chars be zerod after the initializer, I can say so; far more often,
I couldn't care less what defaults come in the places beyond an initial
terminator. In the overwhelming majority of cases, one will not be
peeking ahead of the terminator in a string.

Sep 9 '06 #7

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

Similar topics

2
by: Kris | last post by:
Hi All, I just tried to do something that I thought would be quite simple in C++ and discovered (I think) that it's not possible. I did a bunch of reading and everything that I've seen seems to...
19
by: Henry | last post by:
I finally thought I had an understanding of multi dimensional arrays in C when I get this: #include <stdio.h> #define max_x 3 #define max_y 5 int array;
9
by: Christian Kandeler | last post by:
Hi, if I want to store the string "123456" in a variable of type char, I can do it like this: char s = "123456"; Or like this: char s = { '1', '2', '3', '4', '5', '6', '\0' };
4
by: Stephen Mayes | last post by:
I have initialized an array like this. const char matrix = { {0, 1, 2, 3}, {0, 1, 2}, {0, 1} }; gcc, (with no options set,) errors unless I specify
5
by: toton | last post by:
Hi, I can initialize an array of class with a specific class as, class Test{ public: Test(int){} }; Test x = {Test(3),Test(6)}; using array initialization list. (Note Test do NOT have a...
14
by: Shhnwz.a | last post by:
Hi, I am in confusion regarding jargons. When it is technically correct to say.. String or Character Array.in c. just give me your perspectives in this issue. Thanx in Advance.
6
by: Spiro Trikaliotis | last post by:
Hello, in a project, I stumbled upon code like follows (incomplete): #if defined(MINIXVMD) || defined(MINIX_SUPPORT) || defined(__VBCC__) || (defined(__BEOS__) && defined(WORDS_BIGENDIAN)) ||...
2
by: overdrigzed | last post by:
Hello! I wanted to get the full contents of a character array stored in a struct, i.e. _fields_ = however, ctypes seems to try to return struct.array as a Python string rather than a...
9
by: Rohit | last post by:
I am trying to initialize an array whose initializers depend on value of Enums. I take enum and then decide the initializer value, so that even if enum value changes because of addition to list...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
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
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
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
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
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...
0
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...

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.