How to declare strings in C
Possible Duplicate:
Memory Allocation char* and char[]
有人能给我解释一下这些代码行之间的区别吗
1 2 3
| char *p ="String";
char p2[] ="String";
char p3[7] ="String"; |
在什么情况下,我应该使用上面的每一个?
- 最后一个是缓冲区溢出,这很好。
- 第三个例子应该是p3[6]:您必须解释最后的0
- @事实上需要7个。
- @而是dan编译错误
- 编辑第三个示例
- 哦……脑屁:
- 另外:stackoverflow.com/questions/1880573/…stackoverflow.com/questions/3268292/…stackoverflow.com/questions/3862842/…
这个链接应该满足你的好奇心。
基本上(忘记第三个例子,这很糟糕),1和2之间的区别是1为指向数组的指针分配空间。
但是在代码中,您可以将它们作为指针来操作,这是唯一的一点,您不能重新分配第二个指针。
- 伙计们,在你给fge发布的链接加上书签之前,要注意faq网站已经更新到这个c-faq.com和发布到这个c-faq.com/aryptr(2.1,2.2)的特定链接,但是没有改变。以防万一。
C中的字符串表示为字符数组。
根据C编程语言2ed,您声明的指针指向存储在程序中某些位置的字符串(修改该字符串是未定义的行为)。
您要声明一个由字符串"string"初始化的char数组,该字符串将作业留给编译器来计算数组的大小。
您要声明一个大小为5的数组,并用"string"初始化它。这是一个错误,因为"字符串"不适合5个元素。
char p3[7] ="String";是正确的声明(" "是C字符串中的终止字符)。
http://c-faq.com/~scs/cclass/notes/sx8.html(中文)
- 请注意,链接已更新为c-faq.com/charstring/index.html
你不应该使用第三个,因为它是错误的。"string"需要7个字节,而不是5个。
第一个是指针(可以重新分配到不同的地址),另外两个声明为数组,不能重新分配到不同的内存位置(但它们的内容可能会更改,请使用const来避免这种情况)。
- EDCOX1(0),而危险不是错误的,它是有效的C(但不是在C++)
- @啊-这是错的。它可能通过编译,但它仍然是错误的。
- 这是一个对象的严格一致的定义。严格遵守程序在C方面不是"错误的"。
- @噢,明目张胆的运行时错误是错误的。
- @克里斯,取决于其他的说法,不是吗?不一定有运行时错误。
- @起搏器依赖于很多东西,但在一天结束的时候,它仍然被认为是未定义的行为。未定义的行为是不确定性的,即使程序没有崩溃,它仍然是一个运行时错误。
- @Chris,这提供了代码甚至可以在运行时运行。当然,单独编译代码不会给您带来未定义的行为。
- @pacerier undefined始终引用运行时行为。它确实会编译。
- @Chris,这就是为什么我们不会有未定义的行为,因为编译的代码不会运行,例如,当它被一个if语句包围时,它的值不会为真。
- @Pacerier我真的很难接受这次谈话。不,如果跳过有问题的代码,则不会发生运行时错误。
- @克里斯,是的,我一直都这么说…你说"明目张胆的运行时错误是错误的。"所以我说"取决于其他语句,不是吗?"不一定有运行时错误。"。如果跳过有问题的代码,则不会发生运行时错误,因此根据其他语句,不一定存在运行时错误。
- @Pacerier请不要再刻意地学究了。你很清楚我的陈述并不意味着"使程序无用"。周围的代码是无关的。如果我写的是我不该写的记忆,那就是不好的行为。那是个错误。即使没有人注意到,这仍然是一个错误。即使我的代码从未运行过,仍然存在一个bug。这个bug可能不会运行,但这并不意味着我的代码没有bug。别玩游戏了,你不聪明。
1
| char *p ="String"; means pointer to a string type variable. |
char p3[5] ="String"表示您正在预先定义数组的大小,使其不超过5个元素。注意,对于字符串,空值"0"也被视为元素。因此,由于元素数为7,所以此语句将给出错误,因此它应该是: