gpt4 book ai didi

c++ - 为什么这个数组分配给非指定数组?

转载 作者:太空宇宙 更新时间:2023-11-04 00:50:45 25 4
gpt4 key购买 nike

/* 我观察到的是:

  1. 当我将像“ab”这样的字符串赋给 b(array)
    那么输出是:“ab”“help”“dude”
  2. 当我给出“abc”时
    然后输出是:"abc""""dude"
  3. 如果我给出“abcd” 然后输出是:“abc”“d”“dude”

    等等 */

       #include<stdio.h>
    main()
    {
    char a[5]="help",b[3],c[10]="dude";
    scanf("%s",b);
    printf("\t%s",b);
    printf("\t%s",a);
    printf("\t%s",c);
    }

    /* what i dont get is :
    Here iam gaving a string to b(array), why, if the string has more than the
    required no. of charecters, its printing those charecters in other arrays
    (though i had not assiged scanf to other arrays )?

最佳答案

请记住,C 中的字符串需要空终止符的空间。如果没有空间,打印将继续“到下一个 nul”。以下是您的内存如何看待初始化:

h  e  l  p \0 \0 \0 \0  d  u  d  e \0
^ ^ ^
a b c

当你在 b 指向的位置读入字符串 ab 时:

h  e  l  p \0  a  b \0  d  u  d  e \0
^ ^ ^
a b c

一切都很好。但是 abc 给出:

h  e  l  p \0  a  b  c \0  u  d  e \0
^ ^ ^
a b c

当你打印b时你会得到abc;打印 c 什么也得不到(第一个字符是 '\0')。

最后,输入abcd,你会得到

h  e  l  p \0  a  b  c  d \0  d  e \0
^ ^ ^
a b c

并且打印 c 将导致 "d" - 正如您所看到的那样。

事实上,事物在内存中的存储顺序并不是“定义的”,尽管通常编译器会做类似上述的事情。因此,虽然您知道您不能写入不属于您的内存,但您无法确定当您这样做时会发生什么(就像您的情况一样)。这就是为什么它被称为“未定义的行为”。您不能依赖其他编译器为您提供相同的结果 - 甚至同一个编译器也不能为您提供相同的结果...

有道理吗?

解决办法当然是给b分配更多的空间。这将导致在 bc 之间产生更多的 '\0',并且不会覆盖任何内容。

edit - 我刚刚意识到 ba 的存储顺序似乎与我刚才描述的顺序相反它 - 因为被覆盖的是 a,而不是 c。这表明编译器会随心所欲地安排事情,并且我在写详细答案时应该戴上眼镜。但原理是完全一样的 - 所以我将“把剩下的作为练习留给学生”。

关于c++ - 为什么这个数组分配给非指定数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19462791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com