【问题标题】:Is character array in C dynamic?C中的字符数组是动态的吗?
【发布时间】:2014-02-10 14:01:57
【问题描述】:

我用 C 编写了一个简单的程序。一个输入字符串并将其与长度一起显示的程序。

#include<stdio.h>

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] )。请解释一下。

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

【问题讨论】:

  • 不,这意味着您刚刚执行了缓冲区溢出。 C 不牵你的手。如果有的话,它会直接瞄准你的脚,等待你扣动扳机。
  • 它将覆盖其他内容。在这种情况下可能未使用内存,但请尝试以下操作:int i1=5; char a[4]; int i2=6; printf("i1, i2 are %i, %i\n", i1, i2); gets(a); printf("i1, i2, a are %i, %i, %s\n", i1, i2, a);。这是未定义的行为,这意味着没有任何保证,它可能取决于你的编译器和操作系统(或者它可能会导致恶魔飞出你的鼻子——这在实践中是极不可能的)

标签: c arrays dynamic gets


【解决方案1】:

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

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

【讨论】:

  • 我应该在哪里使用gets ???在编程的哪个部分(通常)gets() 对我们有帮助? fgets() 用作指针。这不会让程序变得复杂吗?
  • @MELWIN 你应该永远使用gets()。将fgets()stdin 一起使用。事实上,在最新的 C 标准(C11)中,gets() 已被删除。
  • 谢谢。我仍在使用 Turbo C++。当输入小于或等于 4 时,它不会返回任何缓冲区溢出。谢谢你的回答
【解决方案2】:

gets() 工作没有被编译器定义,任何事情都可能发生使用 fgets。

Check Here

【讨论】:

    【解决方案3】:

    其他人指出这是未定义的行为。这意味着当您拥有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 中,没有自动边界检查,而且根本无法保证会发生什么。

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

    【讨论】:

      【解决方案4】:

      gets 函数在 C 中使用是危险的。使用 fgets 函数避免它。

      【讨论】:

        猜你喜欢
        • 2013-06-29
        • 2017-08-27
        • 1970-01-01
        • 2017-10-23
        • 2020-07-31
        • 2021-12-29
        • 2013-03-09
        • 2014-05-20
        • 1970-01-01
        相关资源
        最近更新 更多