【问题标题】:Why does the following c code work in turbo c and not in devc++?为什么以下 c 代码在 turbo c 中工作而不在 dev c++ 中工作?
【发布时间】:2017-02-08 14:38:02
【问题描述】:

我有以下代码:

char *str;
gets(str);

现在它可以在 turbo c 中工作,但在 devc 中却失败了。

我必须添加以下内容才能使其在 devC++ 中工作。

char *str = malloc(5);

谁能解释一下,为什么会这样?

还有,哪个是真实的和更正确的编码形式。

【问题讨论】:

  • 1) 不要使用gets() 2) 未分配字符串的未定义行为。
  • 为什么它“在 Turbo C 中工作”是个谜,因为没有为指针分配内存。
  • 您可能想阅读gets
  • 定义指针变量str时,它指向哪里?它需要指向某个内存,gets真的不使用它)写入它读取的字符。

标签: c string pointers compiler-specific


【解决方案1】:

那个

char *str;
gets(str);

只是不可能是对的。 str 未初始化,gets 按值接收指针,因此无法在内部分配它。 未定义的行为,你只是幸运/不幸。

哪一个是真实的和更正确的编码形式?

以上都不是。 不要使用gets。这是不安全的,因为您无法限制输入大小。使用具有指定大小的fgets(当然还有分配的缓冲区!)

#include <stdio.h>
char buffer[20];
fgets(buffer, sizeof(buffer), stdin); // reads at most 19 chars + null-termination

或带有大小限制的scanf(注意-1):scanf("%19s",buffer);

【讨论】:

    【解决方案2】:
    gets(str);
    

    即使在 turbo c++ 中它也不应该工作,因为你没有为 str 分配空间。 正确的方法

     str = (char *)malloc(sizeof(char) * (length+1));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 2011-08-18
      • 2018-10-16
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多