Двойной указатель разыменования в функции - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь понять двойные указатели. Я думаю, что я должен быть в состоянии написать (** min = 3;) в цикле MinMax ниже, но это просто игнорируется. Я думаю, что это должно установить значение, на которое указывает значение min (указатель на начало), равное 3 (или, конечно, любому int). Может кто-нибудь помочь мне понять, почему это сумасшедший разговор? Конечно, в функции нет причин устанавливать это значение, я просто хочу понять, почему оно не работает.

int ar[] = {1,23,4,32,5,67,999,-1};
int *min= 0;
int *max= 0;
MinMax(ar,ar+8,&min,&max);

void MinMax(int *start,int *end, int **min,int **max) {
  // **min = 3; //why not?
  *min = start; 
  *max = start;
  while(++start < end) {
  if(*start < **min) *min = start;
  if(*start > **max) *max = start;
  }
}

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

При входе в функцию * min равно нулю, поэтому ** min = 3 устанавливает целое число по адресу от нуля до трех. Обычно не допускается во время выполнения. Только после инициализации * min действительным адресом, например * min = start, вы можете установить ** min в значение.

0 голосов
/ 05 сентября 2018
void MinMax(int *start,int *end, int **min,int **max) {
    // **min = 3;

Вы начинаете с инициализации аргумента своей функции, указывающего на ноль, поэтому **min не является определенным значением (*min является нулевым, но разыменование нулевого указателя является UB.) Чтобы сделать **min допустимым объектом, сначала установите *min для указания на действительный объект, например

int *min = malloc(sizeof(int));

(не забудьте освободить его позже) или

int m = 0;
int *min = &m;

или даже

int *min = ar;

(думал, что последнее уже выполнено в MinMax.)

0 голосов
/ 05 сентября 2018

В тот момент, когда у вас есть **min = 3, значение *min равно 0, то есть указатель NULL, что означает, что он никуда не указывает. Попытка разыменования *min и последующей записи в него вызывает неопределенное поведение .

В следующих строках *min и *max указывают на то же место, что и start, поэтому после этого их можно разыменовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...