【问题标题】:Inputting into a char* declared earlier crashes the program while doing that into a 'just-declared' char* doesn't. Why?输入早先声明的 char* 会使程序崩溃,而将其输入“刚刚声明的” char* 则不会。为什么?
【发布时间】:2013-04-25 08:40:25
【问题描述】:

这段代码使程序崩溃

#include <cstdio>
int main()
{
    char *name1;
    char *name2 = "Mark";
    gets(name1);
    puts(name1);
    return 0;
}

而这不是

#include <cstdio>
int main()
{
    char *name1 = "Mark";
    char *name2;
    gets(name2);
    puts(name2);
    return 0;
}

为什么? 我正在使用带有 Code::Blocks IDE 的 MinGW。

【问题讨论】:

  • 不要使用裸指针。使用std::string。裸指针非常难以理解和正确使用。
  • 两个版本都错了:没有预留/分配空间

标签: c++ pointers char


【解决方案1】:

你很幸运,一个崩溃而另一个没有。
这两个程序都会产生未定义的行为。

char *name2;
gets(name2);

您需要将指针指向一个有效且足够大的内存,以便能够对其进行写入。你只是在写一个未初始化的指针。这会导致未定义的行为。 未定义的行为不要求崩溃,它的字面意思是任何行为都是可能的,因为在您的情况下,它有时可能会崩溃,也可能不会,但它仍然是一个不正确的程序。

理想的解决方案是简单地使用std::string
如果您坚持使用char *,则需要将此指针指向有效内存。例如

char myArr[256];
char *name2 = &myArr;

【讨论】:

  • "和足够大的内存" -- 你建议如何确保有足够的内存来存储gets 读取的输入? :)
  • @Alok 一个好的和快速的答案。谢谢兄弟!
【解决方案2】:

两者都是未定义的行为,它是否会崩溃,是运气的问题。

【讨论】:

    【解决方案3】:

    您必须为输入提供内存,但您没有。如果你想坚持getsputs,你应该把char *name改成char name[100]或者分配内存:

    char *name = new char[100];
    ...
    delete name;
    

    如果您需要超过 100 个字符(包括字符串末尾的 \0 字符),则必须相应地增加大小。

    在 C++ 中使用 std::string 很可能是更好的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多