C中的初始化字符串

时间:2010-07-20 23:46:58

标签: c arrays initialization char

我有一个问题,关于如何操作c字符串初始化的正确方法 例如,下一个代码并不总是正确的。

char *something;
something = "zzzzzzzzzzzzzzzzzz";

我测试了一点点增加了zetas的数量,并且有效地使程序崩溃了两行,那么这个char数组的实际大小限制是多少?我怎么能确定它不会崩溃,这个限制实现是否依赖?以下代码是否一直是我必须使用的正确方法?

char something[FIXEDSIZE];
strcpy(something, "zzzzzzzzzzzzzzzzzzz");

4 个答案:

答案 0 :(得分:8)

正如您所说,操纵此字符串会导致未定义的行为:

char *something;
something = "zzzzzzzzzzzzzzzzzz";

如果您对原因感到好奇,see "C String literals: Where do they go?"

如果你计划完全操纵你的字符串,(如果你想要它是可变的)你应该使用它:

char something[] = "skjdghskfjhgfsj";

否则,只需将char *声明为const char *,即表示它指向常量。

在第二个示例中,编译器将足够智能,可以将其声明为堆栈上的数组,以保存字符串。因此,它的大小受到你的堆栈的限制。

当然,您可能还是想要指定大小,因为知道何时操作字符串通常很有用。

答案 1 :(得分:1)

第一个例子只是错误的,char *something应该是const char *something。否则,这个:

const char *something = "fooooooooooooooooooooooobar";

......应该有效,不应该崩溃。

char something[FIXEDSIZE];

...但是,如果您溢出堆栈,那么这个堆栈溢出通常会崩溃,这取决于堆栈的大小,该阵列的大小,调用的位置等等。 / p>

答案 2 :(得分:1)

第二个总是正确的。

第一个是正确的,只有在你永远不会改变字符串时,因为你已经指定了一个指向固定数据的指针。

答案 3 :(得分:-1)

首先应该永远不会崩溃。一旦'z'+ 1的数量越过堆栈页面上的可用空间,或者如果您尝试从函数返回,第二个将崩溃。