Исключение выдается при использовании malloc () для создания массива символов - PullRequest
0 голосов
/ 05 февраля 2019

По сути, я пытаюсь создать программу, которая просто принимает ввод от пользователя, а затем печатает его, используя динамически распределенную память.Да, я знаю, как сделать это простым способом, но я пытаюсь разобраться в тонкостях управления памятью в C. Так что же не так с этим кодом?он работает без ошибок, но когда я ввожу строку в командную строку, он перестает работать и выдает исключение по шестнадцатеричному адресу.Заранее спасибо.

int main() {
  char *input;

  input = (char *)malloc(20 * sizeof(char)); 
  puts("Enter the string you wish to display"); 
  scanf_s("%s", input); 
  printf_s("%s", *input); 
  free(input);  
  return 0; 
}

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Вы, вероятно, хотите это:

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

int main() {
  char *input;

  input = malloc(20 * sizeof(char)); // (char *) is not needed here (but doesn't harm either)
  puts("Enter the string you wish to display");
  scanf("%s", input);
  printf("%s", input);  // *input is wrong here
  free(input);
  return 0;
}

Не используйте _s версии, поскольку они не являются стандартными для каждой платформы и более или менее бессмысленными, просто используйте scanf и printf.

0 голосов
/ 05 февраля 2019

Вы используете scanf_s("%s", ... неправильно.

Дословно от документы :

Основное различие между более безопасными функциями (которые имеют _s суффикс) и другие версии таковы, что для более безопасных функций требуется размер в символах каждого c , C , s , *Поле типа 1017 * S и [, передаваемое в качестве аргумента сразу после переменной.

Таким образом, если input указывает на 1-й символ последовательности 20 char, тогда оно должно быть:

  scanf_s("%s", input, 20); 

Извлеченные уроки: Если есть сомнения, (повторно-) прочитай документацию!

0 голосов
/ 05 февраля 2019

Ваш компилятор должен предупреждать вас об этой строке:

printf_s("%s", *input);

Если нет, вам необходимо включить параметр «все предупреждения».(В gcc и clang добавьте -Wextra в командную строку.)

В сущности, имеется несоответствие между типом аргумента (char) и типом, ожидаемым строкой формата (* 1008)*).*input разыменовывает указатель символа и, таким образом, вычисляется до первого символа в строке."%s" ожидает указатель на массив символов с нулевым символом в конце.

Должен работать, если вы удалите *:

printf_s("%s", input);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...