函数调用后指针未指向正确的数组元素
Pointer not pointing to the correct array element after function call
我的主函数中有两个指针变量:largest_ptr 和 smallest_ptr。
任务是调用 find_max_min() 函数将两个数组(均为全局)中的最大和最小元素分配给各自的指针。
void find_min_max(uint8_t* a, uint8_t* b); //function declaration
uint8_t array1[] = { <some values> };
uint8_t array2[] = { <some values> };
int main(void)
{
uint8_t* largest_ptr;
uint8_t* smallest_ptr;
find_min_max(largest_ptr, smallest_ptr); //this does not assign any addresses
}
void find_min_max(uint8_t* largest, uint8_t* smallest){
//correct code to find the max/min in array1 and array2, and assign the addresses of the elements to largest and smallest
}
我尝试调试我的 find_min_max 函数,结果是正确的,即正确的值被分配给了最大和最小指针。但是,当我调用main()中的函数时,largest_ptr和smallest_ptr并没有分配各自的地址。我做错了什么吗?
P.S
我很抱歉没有发布代码。这是一道作业题,可能会在抄袭测试中被发现。我相信这足以解释我的情况
通过他们的地址传递你的指针参数以达到你的目的。
void find_min_max(uint8_t** a, uint8_t** b);
find_min_max(&largest_ptr, &smallest_ptr);
而不是
void find_min_max(uint8_t* a, uint8_t* b);
smallest_ptr是指向uint_8的指针类型变量,它保存的值是一个地址。您创建的函数定义将 smallest 声明为另一个此类指针。当您执行函数调用时,您使用表达式的评估结果初始化 smallest。通常这样的表达式是文字或单个变量。后者就是这种情况。表达式 smallest_ptr 计算为某个地址,该地址按值传递给函数,即 - 分配给 smallest.
虽然我看不到你函数的内部工作原理,但我假设你不是从 smallest 读取,而是写入它。但是 smallest 是一个局部变量,其范围和生命周期与函数相关。你写入这个变量然后结果丢失了。
你想要实现的是在你的函数范围之外操作一些数据。一种可能性是通过参数向函数提供该数据的地址,声明如下:
func( TYPE* x)
{
//...
*x = VALUE; // we don't want to set local variable,
// but the variable being pointed to by it, so we dereference the local pointer
}
像这样调用:
TYPE y;
func(&y);
其中 & 是地址运算符,所以我们提供 y 的地址,以便 func() 函数能够写入。
由于在您的情况下需要操作的变量是指向 uint8_t 的指针,您需要传递指针的地址,因此局部变量需要是指向指针的指针 - func(int* * x);
我的主函数中有两个指针变量:largest_ptr 和 smallest_ptr。 任务是调用 find_max_min() 函数将两个数组(均为全局)中的最大和最小元素分配给各自的指针。
void find_min_max(uint8_t* a, uint8_t* b); //function declaration
uint8_t array1[] = { <some values> };
uint8_t array2[] = { <some values> };
int main(void)
{
uint8_t* largest_ptr;
uint8_t* smallest_ptr;
find_min_max(largest_ptr, smallest_ptr); //this does not assign any addresses
}
void find_min_max(uint8_t* largest, uint8_t* smallest){
//correct code to find the max/min in array1 and array2, and assign the addresses of the elements to largest and smallest
}
我尝试调试我的 find_min_max 函数,结果是正确的,即正确的值被分配给了最大和最小指针。但是,当我调用main()中的函数时,largest_ptr和smallest_ptr并没有分配各自的地址。我做错了什么吗?
P.S
我很抱歉没有发布代码。这是一道作业题,可能会在抄袭测试中被发现。我相信这足以解释我的情况
通过他们的地址传递你的指针参数以达到你的目的。
void find_min_max(uint8_t** a, uint8_t** b);
find_min_max(&largest_ptr, &smallest_ptr);
而不是
void find_min_max(uint8_t* a, uint8_t* b);
smallest_ptr是指向uint_8的指针类型变量,它保存的值是一个地址。您创建的函数定义将 smallest 声明为另一个此类指针。当您执行函数调用时,您使用表达式的评估结果初始化 smallest。通常这样的表达式是文字或单个变量。后者就是这种情况。表达式 smallest_ptr 计算为某个地址,该地址按值传递给函数,即 - 分配给 smallest.
虽然我看不到你函数的内部工作原理,但我假设你不是从 smallest 读取,而是写入它。但是 smallest 是一个局部变量,其范围和生命周期与函数相关。你写入这个变量然后结果丢失了。
你想要实现的是在你的函数范围之外操作一些数据。一种可能性是通过参数向函数提供该数据的地址,声明如下:
func( TYPE* x)
{
//...
*x = VALUE; // we don't want to set local variable,
// but the variable being pointed to by it, so we dereference the local pointer
}
像这样调用:
TYPE y;
func(&y);
其中 & 是地址运算符,所以我们提供 y 的地址,以便 func() 函数能够写入。
由于在您的情况下需要操作的变量是指向 uint8_t 的指针,您需要传递指针的地址,因此局部变量需要是指向指针的指针 - func(int* * x);