【问题标题】:C: String assignment to character arrayC:字符串赋值给字符数组
【发布时间】: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


【解决方案1】:

您的代码表现出未定义的行为。它偶然为您工作,但在另一台机器上它可能会失败。正如您从常见问题解答中了解到的那样,该代码无效。但这并不意味着它总是会失败。这只是未定义行为的本质。从字面上看,任何事情都可能发生。

访问ar[3] 是非法的,因为它超出了数组的末尾。此数组的有效索引为 0、1 和 2。

您没有为 c 分配内存,因此指针的任何取消引用都是未定义的行为。

您的main 声明错误。你应该写:

int main(void)

【讨论】:

  • 我已经在键盘上进行了检查。请检查它在那里工作。
  • 请再次阅读答案。代码似乎可以在一个平台和编译器上运行这一事实并不意味着该代码是合法的。你刚刚走运了。你的运气很快就会用完。
  • 一开始我是对的,但是键盘让我很困惑...我检查那里的键盘只是忘记了...
  • 主函数参数中是否需要提及void,返回类型为int。
  • 你的主要是非标准的。这样做肯定更容易吗?
【解决方案2】:

不要这样做。声明 char NIS[3]; 为您提供了一个三字符数组,您可以在其中使用索引 02(含)。

任何使用其他索引(用于取消引用)都是未定义的行为,不应这样做。

它可能起作用的原因是没有任何说明“垃圾”值必须为非零。这就是垃圾在这种情况下的含义,它们可以是任何东西。

您的 strcpy 也是未定义的行为,因为您的 c 指针尚未初始化为任何有用的东西。

【讨论】:

    【解决方案3】:

    ar[3] 不存在,因为 ar 只有 3 个字符长。

    那个常见问题是说它合法的,但它不是一个C字符串。

    如果数组太短,空字符会被截掉。

    基本上,“abc”默认为 'a'、'b'、'c'、0。但是,由于 ar 的长度为 3 而不是 4,因此空字节会被截断。

    编译器在这种情况下(和操作系统)选择做什么是未知的。如果它碰巧奏效了,那只是运气。

    【讨论】:

      猜你喜欢
      • 2016-05-12
      • 2012-11-04
      • 1970-01-01
      • 2020-07-31
      • 2011-08-02
      • 1970-01-01
      • 2016-04-01
      • 2011-12-08
      • 2017-09-27
      相关资源
      最近更新 更多