为什么在没有 calloc 函数的情况下会出现错误 运行-time?

Why do I get error run-time without calloc function?

当我使用char*存储一个没有callocname时,它会在运行时出错:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main()
{
  char* name;
  cout << "What's your name? ";
  gets (name);
  cout << "Hello, " << name;
  return 0;
}

我用的时候没有问题:

char* name = (char *) calloc(100, sizeof(char));

你能告诉我为什么吗?谢谢,

char* name;

声明 name 为指针。但它是未初始化的。

gets (name);

尝试将输入读入 name 指向的任何内容。由于 name 尚未初始化为指向有效内存,因此尝试将数据读入 name 指向的内容是未定义的行为。您的程序可以做任何事情。

当您使用时:

char* name = (char *) calloc(100, sizeof(char));

name 指向一个可以容纳 100 个字符的位置。如果您的输入少于 100 个字符(为终止空字符留一个),则

gets(name);

会好的。如果输入的是 100 个或更多字符,您的程序将再次出现未定义的行为。这就是为什么使用 gets 被认为是一种安全风险。不要使用它。有关详细信息,请参阅 Why is the gets function so dangerous that it should not be used?

改为使用

fgets(name, 100, stdin);

gets 在其参数中存储字符序列。因此,您需要提前分配该序列。否则,它会将序列存储在内存中(未初始化)name 指向的随机位置。幸运的是程序立即崩溃了。就我而言,该程序现在可以运行,这更危险,因为它将来可能会崩溃。此外,此功能已被弃用,请查看 here.