为什么数组接收的值多于声明要保存的值

use*_*058 4 c arrays undefined-behavior

int main(void)
{
    char name1[5];
    int count;
    printf("Please enter names\n");
    count = scanf("%s",name1);
    printf("You entered name1 %s\n",name1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我输入超过5个字符时,它打印出我输入的字符,它超过5,但char数组声明为:

char name1[5];
Run Code Online (Sandbox Code Playgroud)

为什么会这样

Mic*_*ers 12

因为字符存储在"存储空间"之后的地址上.这非常危险,可能导致崩溃.

例如,假设您输入name:Michael,name1变量从0x1000开始.

name1: M       i     c      h      a      e      l     \0
      0x1000 0x1001 0x1002 0x1003 0x1004 0x1005 0x1006 0x1007
      [................................]
Run Code Online (Sandbox Code Playgroud)

分配的空间显示为[...]这意味着从0x1005内存被覆盖.

解:

在复制之前,只复制5个字符(包括末尾的\ 0)或检查输入字符串的长度.

  • `scanf(%4s",name1);`也将完成这项工作. (2认同)

Sha*_*our 6

这是未定义的行为,您正在编写超出已分配内存的范围.任何事情都可能发生,包括似乎正常工作的程序.

C99标准草案部分J.2 未定义行为说:

在以下情况下,行为未定义:

并包含以下项目符号:

数组下标超出范围,即使一个对象显然可以使用给定的下标访问(如左边的表达式a [1] [7],给出声明int a [4] [5])(6.5.6).

这适用于更一般的情况,因为E1 [E2]与(*((E1)+(E2)))相同.