Почему я получаю ошибку во время выполнения без функции calloc?

Когда я использую 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));

Ты можешь сказать мне, почему? Спасибо,

0

Решение

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);
2

Другие решения

gets сохраняет последовательность символов в своем аргументе. Таким образом, вам нужно выделить эту последовательность заранее. В противном случае он будет хранить последовательность в произвольном месте в памяти, где (неинициализировано) name точки. К счастью, программа сразу вылетает. В моем случае программа работает сейчас, что более опасно, потому что она может сломаться в будущем. Кроме того, эта функция считается устаревшей, посмотрите на Вот.

0

По вопросам рекламы [email protected]