我正在尝试理解双指针。我认为我应该能够在下面的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;
}
}
答案 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
中执行。)