C动态中的字符数组是?

我在C中编写了一个简单的程序。一个程序输入一个String并显示它和长度。

#include int main() { char a[4]; printf("Enter the name : "); gets(a); printf("\nThe name enterd is : %s",a); printf("\nLength of string is : %d",strlen(a)); getch(); return 0; } 

该程序不包含警告或错误。

在运行时,我输入值“ melwinsunny ”作为输入。 没有错误,显示的结果是:

 Enter the name : melwinsunny The name entered is : melwinsunny length of string is : 11 

为什么会这样? 我已经声明了长度为4的字符数组( char a [4] )。 请解释。

这是否意味着字符数组是动态的?

其他人指出,这是不明确的行为。 这意味着当你有char a[4]并且你试图访问任何超出范围的东西时(例如a[4] = 't' ),那么就无法保证程序的行为方式。 在某些情况下,它可能会起作用,而在其他情况下,它可能会崩溃。 由于无法保证,依赖此类代码尤其无用。

gets()的问题是你不能告诉它缓冲区有多大,所以它不知道何时停止写入提供的缓冲区。 您输入了11个字符,并且gets了相当于:

 a[0] = 'm'; a[1] = 'e'; a[2] = 'l'; a[3] = 'w'; a[4] = 'i'; // at this point, we are writing out-of-bounds a[5] = 'n'; /* ... etc ... */ a[12] = '\0'; 

在C中,没有自动边界检查,并且根本不能保证会发生什么。

写入不受限制的缓冲区的函数通常被认为是不安全的(除非记录该函数不要写入超过一定数量的字符等)。

不,C中的数组不是动态的,你看到的是由于缓冲区溢出而导致的未定义行为。

这就是你不应该使用gets()的原因,而是使用fgets() ,这样可以防止缓冲区溢出。

gets()工作未定义编译器使用fgets可能发生任何事情。

检查一下

获取函数在C中使用是危险的。通过使用fgets函数避免它。