Когда я использую char*
хранить name
без calloc
во время выполнения будет ошибка:
#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
считается угрозой безопасности. НЕ ИСПОЛЬЗУЙТЕ ЕГО. Для получения дополнительной информации см. Почему функция get так опасна, что ее нельзя использовать?.
Вместо этого используйте
fgets(name, 100, stdin);
gets
сохраняет последовательность символов в своем аргументе. Таким образом, вам нужно выделить эту последовательность заранее. В противном случае он будет хранить последовательность в произвольном месте в памяти, где (неинициализировано) name
точки. К счастью, программа сразу вылетает. В моем случае программа работает сейчас, что более опасно, потому что она может сломаться в будущем. Кроме того, эта функция считается устаревшей, посмотрите на Вот.