开发者

Initialization strings in C

I have a question about how is the correct way of manipulate the initialization of c strings For example the next code, isn't always correct.

char *something;
something = "zzzzzzzzzzzzzzzzzz";

i test a little incrementing the number of zetas and effectively the program crash in like about two lines, so what is the real size limit in this char array? how can i be sure that it is not going to crash, is this limit implementation dependent? Is the following code the correct approach that i always must use?

char something[FIXEDSIZE];
strcpy(something, "zzzzzzzzzzzzzzzzzzz");
开发者_JAVA技巧


As you say, manipulating this string leads to undefined behaviour:

char *something;
something = "zzzzzzzzzzzzzzzzzz";

If you are curious as to why, see "C String literals: Where do they go?".

If you plan to manipulate your string at all, (i.e. if you want it to be mutable) you should use this:

char something[] = "skjdghskfjhgfsj";

Otherwise, simply declare your char * as a const char * to indicate that it points to a constant.

In the second example, the compiler will be smart enough to declare this as an array on the stack of the exact size to hold the string. Thus, the size of this is limited by your stack.

Of course, you will likely want to specify the size anyway, since it is usually useful to know when manipulating the string.


The second is always correct.

The first is correct only if you never change the string, since you've assigned a pointer to fixed data.


The first example is only incorrect in that char *something should really be const char *something. Otherwise, this:

const char *something = "fooooooooooooooooooooooobar";

...should work, and should not crash.

char something[FIXEDSIZE];

...this one, however, can typically crash with a stack overflow if you, well, overflow the stack, which depends on how big that stack is, how big that array is, where this gets called, etc.


first should never crash. second will crash as soon as the number of 'z' + 1 go over the available space on the stack page, or if you try to return from the function.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜