Как передать int и int * в функцию для определения переменной - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть переменная типа int и переменная-указатель типа int, которую я должен передать в функцию, которая может установить обе переменные равными числу.Насколько я понимаю, мне нужно всего лишь изменить строку кода setint(b, 20);, чтобы решить эту проблему

Я пытался добавить & и * перед переменной b, но этовынудил файл не скомпилироваться.

void setint(int* ip, int i)
{
  *ip = i;
}

int main(int argc, char** argv)
{
  int a = -1;
  int *b = NULL;

  setint(&a, 10);
  cout << a << endl;
  setint(b, 20);
  cout << b << endl;

Результат этого кода должен вывести:

10
20

в настоящее время вывод:

10
segment fault

Ответы [ 3 ]

1 голос
/ 12 апреля 2019
void setint(int* ip, int i)
{
  if(ip != NULL) //< we should check for null to avoid segfault
  {
    *ip = i;
  }
  else
  {
    cout << "!!attempt to set value via NULL pointer!!" << endl;
  }
}

int main(int argc, char** argv)
{
  int a = -1;
  int *b = NULL;

  setint(&a, 10);
  cout << a << endl;
  setint(b, 20);      //< should fail (b is currently NULL)
  // cout << *b << endl;

  b = &a; //< set pointer value to something other than NULL

  setint(b, 20);      //< should work
  cout << *b << endl;

  return 0;
}
1 голос
/ 12 апреля 2019

Что ваш код делает / пытается / не может сделать (см. Добавленные комментарии):

int main(int argc, char** argv)
{
  int a = -1;    // define and init an int variable, fine
  int *b = NULL; // define and init a pointer to int, albeit to NULL, ...
                 // ... not immediatly a problem

  setint(&a, 10);    // give the address of variable to your function, fine
  cout << a << endl; // output, fine

  setint(b, 20);  // give the NULL pointer to the function, 
                  // which attempts to dereference it, segfault

  cout << b << endl;

Что может достичь того, что вы намерены (по крайней мере, оно достигает того, чего, я думаю, вы хотите ...):

int main(int argc, char** argv)
{
  int a = -1;
  int *b = &a; // changed to init with address of existing variable

  setint(&a, 10);
  cout << a << endl;
  setint(b, 20);      // now gives dereferencable address of existing variable
  cout << *b << endl; // output what is pointed to by the non-NULL pointer

Кстати, если вы потом выведите a снова, он покажет значение, установленное для него через указатель, то есть 20, что переписало ранее записанное значение 10.

0 голосов
/ 12 апреля 2019

Вам необходимо выделить память для b (a уже выделено компилятором в стеке) с помощью:

#include <stdlib.h>
int *b = (int *)malloc(sizeof(int));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...