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函数避免它。