函数中的双指针解引用

时间:2018-09-05 12:37:52

标签: c pointers

我正在尝试理解双指针。我认为我应该能够在下面的MinMax循环中写入(** min = 3;),但是它只是被忽略了。我认为应该将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 :(得分:2)

此时,您拥有**min = 3的值*min为0,即NULL指针,这意味着它没有指向任何地方。尝试解除对*min的引用并随后对其进行写操作将调用undefined behavior

以下几行将*min*max都设置为与start指向同一位置,因此之后可以将其取消引用。

答案 1 :(得分:1)

在输入函数时* min为零,因此** min = 3会将地址0处的整数设置为3。通常在运行时不允许。只有在将* min初始化为有效地址(例如* min = start)之后,才可以将** min设置为一个值。

答案 2 :(得分:1)

void MinMax(int *start,int *end, int **min,int **max) {
    // **min = 3;

首先要初始化函数的参数以指向null,以便**min不是定义的值(*min为null但取消引用null指针为UB。)使**min为a有效对象,首先将*min设置为指向有效对象,例如

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

(不要忘了以后再分配它)或

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

甚至

int *min = ar;

(认为后者已在MinMax中执行。)