char *toParseStr = (char*)malloc(10);
printf("Enter string here: ");
scanf("%s",toParseStr);
printf("%s",toParseStr);
free(toParseStr);
Во-первых, строка в scanf
указывает ввод, который она собирается получить.Чтобы отобразить строку перед принятием ввода с клавиатуры, используйте printf
, как показано.
Во-вторых, вам не нужно разыменовывать toParseStr
, так как он указывает на массив символов размером 10, как вы выделили с помощьюmalloc
. Если вы использовали функцию, которая указала бы ее на другое место в памяти, , то &toParseStr
требуется.
Например, предположим, что вы хотите написать функциювыделить память.Тогда вам понадобится &toParseStr
, поскольку вы изменяете содержимое переменной-указателя (это адрес в памяти - вы можете убедиться сами, распечатав его содержимое).
void AllocateString(char ** ptr_string, const int n)
{
*ptr_string = (char*)malloc(sizeof(char) * n);
}
КакВы можете видеть, что он принимает char ** ptr_string
, который читает как указатель, который хранит место в памяти указателя, который будет хранить адрес памяти (после операции malloc
) первого байта выделенного блокаn
байт (сейчас у него есть некоторый адрес мусорной памяти, поскольку он не инициализирован).
int main(int argc, char *argv[])
{
char *toParseStr;
const int n = 10;
printf("Garbage: %p\n",toParseStr);
AllocateString(&toParseStr,n);
printf("Address of the first element of a contiguous array of %d bytes: %p\n",n,toParseStr);
printf("Enter string here: ");
scanf("%s",toParseStr);
printf("%s\n",toParseStr);
free(toParseStr);
return 0;
}
В-третьих, рекомендуется освободить выделенную память.Даже если это вся ваша программа, и эта память будет освобождена при выходе из программы, это все же хорошая практика.