【发布时间】:2012-05-24 18:26:32
【问题描述】:
读完c-faq question 后,我回来了,我完全对这里发生的事情感到困惑。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main ()
{
char ar[3]="NIS", *c;
printf ("%s\n", ar);
strcpy (c, ar);
printf ("%s\n", c);
if (ar[4] == '\0')
{
printf ("Null");
}
else
{
printf ("%c\n", ar[4]);
}
}
在这里,我分配了“NIS”等大小的声明数组。当我尝试访问 ar[3],ar[4] 时它给出 null 为什么?在 ar[3] 的情况下没关系,但为什么在 ar[4] 的情况下是这样的另一个想法:在 c-faq 中提到,如果您分配任何等于声明数组大小的字符串,则不能使用 printf (" %s") 和 strcpy() 在该数组上,如 c-faq 中所述。但是在我上面的代码中,我在这里使用了 printf 和 strcpy 都可以正常工作。可能是我解释错了,请纠正我。另一个问题是,当我尝试将 ar[5] 与 null 进行比较时,它没有打印任何可以的东西,但为什么它为 ar[4] 打印 Null。我对这个“NIS”字符串的想法将像这样存储在内存中。 .
提前致谢。
--------------------------------------------------------
| N | I | S | /0 | Garbage value here
|_______|________|_______|________|_____________________
ar[0] ar[1] ar[2] ar[3]
好吧,当我将 ar[3] 与 '\0' 进行比较时,它给出了 null 没关系,但是当我将它与 ar[4] 比较时,它仍然给我 null 而不是一些垃圾值..
【问题讨论】:
-
ar[3]不是 C 字符串。将其声明为ar[4],以便它可以容纳额外的\0字节。 -
@Daniel Kamil Kozar:亲爱的,请先阅读整个问题,你为什么这么匆忙......我知道你指出了什么。
-
堆栈的内容在进入你的函数时是未定义的。在这种情况下,您显然很幸运,在您的 C 字符串后面有一个
\0。然而,情况并非总是如此。很抱歉没有早点阅读整个问题。另外,int main(void)而不是void main()。 -
@DanielKamilKozar:我的代码中是否有必要提到 main(void)....???我不这么认为
-
是的。在 C 中,
main()创建一个具有任意数量参数的函数。
标签: c