我有一个问题,关于如何操作c字符串初始化的正确方法 例如,下一个代码并不总是正确的。
char *something;
something = "zzzzzzzzzzzzzzzzzz";
我测试了一点点增加了zetas的数量,并且有效地使程序崩溃了两行,那么这个char数组的实际大小限制是多少?我怎么能确定它不会崩溃,这个限制实现是否依赖?以下代码是否一直是我必须使用的正确方法?
char something[FIXEDSIZE];
strcpy(something, "zzzzzzzzzzzzzzzzzzz");
答案 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的数量越过堆栈页面上的可用空间,或者如果您尝试从函数返回,第二个将崩溃。