为什么在没有 calloc 函数的情况下会出现错误 运行-time?
Why do I get error run-time without calloc function?
当我使用char*
存储一个没有calloc
的name
时,它会在运行时出错:
#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.
当我使用char*
存储一个没有calloc
的name
时,它会在运行时出错:
#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.