Ошибка сегментации с функцией getline ()?

Это сценарий для областей.

1) Внутри вашего плагина создайте структуру папок

Areas
..Plugin
....Controllers
....Views

2) Внутренние контроллеры создают базовый контроллер плагина «PluginController», где вы установили атрибут Area

[Area("Plugin")]
public class PluginController : Controller
{
    ...
}

3) Сделайте все свои контроллеры плагинов наследуемыми от PluginController

public class CustomerController : PluginController
{
    ...
}

4) Добавьте поддержку областей в построитель маршрутов

app.UseMvc(routes =>
{
    routes.MapRoute(
    name: "defaultWithArea",
    template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

    routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{id?}");
});

Теперь все действия внутри вашего плагина потребуют www.mysite.com/plugin/ ...

Также я хочу отметить, что если вы хотите получить URL-адреса действия из-за пределов плагина, вам нужно указать область контроллера следующим образом:

@Url.Action("Edit", "Customer", new { Area = "Plugin" })
-1
задан alk 19 January 2019 в 11:23
поделиться

3 ответа

Вы забыли инициализировать buffer. И вам лучше завершить свою строку управления форматом printf (3) с помощью \n или иначе вызвать fflush (3) перед любым вводом (начиная с stdio (3) [ 117] буферизируется).

Неинициализированный указатель содержит мусор. Его использование - неопределенное поведение . Будьте напуганы !

Так что я предлагаю кодировать

size_t bufsiz = 64;
char *buffer = malloc(bufsiz);
if (!buffer) { perror("malloc buffer"); exit(EXIT_FAILURE); };

и позже

printf("Salut ! Quel est ton nom ?\n");
characters = getline(&buffer,&bufsize,stdin);

В следующий раз включите все предупреждения и информацию отладки, когда компилируя, поэтому скомпилируйте ваш код с помощью gcc -Wall -Wextra -g, если используете GCC . Вы бы получили несколько предупреждений.

Конечно, прочитайте Как отлаживать небольшие программы и отладка с помощью GDB

В Linux, в В вашем конкретном случае вас может заинтересовать использование readline (3) вместо getline (3) .

Не забудьте прочитать документацию по каждой функции, которую вы используете (например, здесь , если она стандартная C).

0
ответ дан Basile Starynkevitch 19 January 2019 в 11:23
поделиться

Переменная 'buffer' указывает на какой-то адрес мусорной памяти. Сначала вам нужно выделить необходимую память, используя функцию malloc или сделать «буфер» статическим массивом вместо указателя.

0
ответ дан Starl1ght 19 January 2019 в 11:23
поделиться

getline() можно использовать двумя различными способами:

  1. Считать в буфер, предоставленный вызывающей стороной.
  2. Выделите память при чтении.

Для использования 1. инициализируйте переданный указатель, чтобы указать на действительную память, и передайте также размер последней.

#define INITIAL_SIZE (42)

int main(void)
{  
  char * buffer = malloc(INITIAL_SIZE * sizeof *buffer);
  size_t bufsize = INITIAL_SIZE;
  ssize_t characters = getline(&buffer, &bufsize, stdin);
  if (-1 == characters)
  {
     /* handle error. */
  }
  else
  {
     /* use buffer */
  }

  free(buffer); /* Free buffer. */
}

Для использования 2. инициализируйте указатель, переданный NULL, и передайте 0 как размер.

int main(void)
{
  char * buffer = NULL;
  size_t bufsize = 0;
  ssize_t characters = getline(&buffer, &bufsize, stdin);
  if (-1 == characters)
  {
     /* handle error. */
  }
  else
  {
     /* use buffer */
  }

  free(buffer); /* Free buffer. */
}

Примечание: getline() возвращает ssize_t , а не size_t.

0
ответ дан alk 19 January 2019 в 11:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: