【问题标题】:Pointer not pointing to the correct array element after function call函数调用后指针未指向正确的数组元素
【发布时间】:2017-01-12 17:46:24
【问题描述】:

我的主函数中有两个指针变量:maximum_ptr 和 minimum_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() 中调用该函数时,相应的地址并未分配给最大_ptr 和最小_ptr。有什么我做错了吗?

附言
我很抱歉没有发布代码。这是一个作业问题,这可能会在抄袭测试中被发现。我有信心这足以解释我的情况

【问题讨论】:

  • 你是否直接在函数中更改largestsmallest(例如:largest = array1[0];)?如果是,那么您可能应该将该函数声明为 void find_min_max(uint8_t** a, uint8_t** b);
  • 使用双指针。例如void find_min_max(uint8_t** largest, uint8_t** smallest){ 并致电find_min_max(&amp;largest_ptr, &amp;smallest_ptr);
  • 阅读“按价值传递”是什么意思!注意:C 是严格按值传递。绝对没有引用调用。

标签: c pointers memory-address


【解决方案1】:

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);

【讨论】:

  • 非常感谢您的解释。我的方法声明现在是:void find_min_max(uint8_t** a, uint8_t** b);。我将最大指针和最小指针的地址作为参数传递给函数。但是,还有一个我无法解决的问题(对不起,我是这方面的新手)。在我的find_min_max() 函数中,我用声明调用了另外两个函数:uint8_t* find_min(uint8_t* array_ptr, uint8_t len) 和一个类似的find_max 函数。
  • 那么我如何将find_min_max()函数中的局部变量smallest赋给'find_min()'(它是一个指针)返回的值。我试过这个任务:smallest_ptr = &amp;(find_min(array1, array1_len))。但是编译器给了我一个错误:lvalue required as unary '&amp;' operand。非常感谢您的再次帮助。
  • 请阅读以下部分:en.cppreference.com/w/c/language/operator_member_access的取消引用和地址
  • 您需要对此有很好的理解,并对被调用的函数与调用它的函数之间的交互进行后续分析。他们的交流仅限于几个渠道。其中之一是通过全局变量,我建议避免。每当您觉得不得不使用全局变量作为在程序范围之间(例如在两个独立函数之间)传输数据的一种方式时,请尝试通过使用其他通道来避免这种情况。
【解决方案2】:

通过它们的地址传递您的指针参数以实现您的目标。

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);

【讨论】:

    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    相关资源
    最近更新 更多