指针受功能调用的影响应该是不应该的

时间:2011-02-14 08:41:22

标签: c function pointers

我正在调用下面的函数,它计算传入的变量中给出的值。但是,当函数(calculate_distance)运行时,传递给函数的变量(loc_ptr)中包含的数据似乎会发生变化。

我已经逐步完成了代码,发现变量loc_ptr在函数调用中受到影响,而不是在函数本身内部。

在while循环中调用该函数。 while循环的第一次迭代正确计算,只有在后续迭代中才会出现问题。

_注意:location是一个typedef结构,包含char * name,double latitude,double longitude。 options是一系列双打._

double calculate_distance(location from, location to) {
    return to.latitude - from.latitude;
}

main() {
    location current_location = {"Plymouth", 50.378565, -4.134339};
    location locations[3] = {{"Padstow", 50.5384, -4.9378}, 
                            {"Newquay", 50.412, -5.0757}, 
                            {"Boscastle", 50.684, -4.6929}};

    // create a pointer to an array of locations.
    location* loc_ptr;
    loc_ptr = &locations[0];

    double options[3];
    int i = 0;
    int position = 3;

    while (i < position) {
        // calculate the distance between the current and other locations
        options[position] = calculate_distance(current_location,
                                                loc_ptr[position]);
        position--;
    }
    // handle the rest of the algorithm
}

注意:代码是较大算法的一部分,它会缩短,因为它会很长。 while循环结束后,重建loc_ptr数组以删除其中一个元素。

5 个答案:

答案 0 :(得分:2)

您的示例代码确实......

  • 因各种原因,拼写错误和遗漏而无法编译;以及

  • 不包含任何可以解释您观察到的行为的明显错误。

它也是荒谬的(例如,locations不存在)。这意味着你要么看到鬼,要么你的示例代码没有显示真正的代码真正做的事情(并且不再包含有问题的bug,因为你将它删除了)。

无论哪种方式,没有人能说出来,因为你没有提供足够的信息。

尝试this little debugging technique

编辑:更新问题后,至少您的示例代码正确编译(在我添加typedef之后)。它访问第一个循环上的未定义内存(因为定义为例如options[3]的数组确实具有元素options[0] .. options[2],但不具有options[3])。 发生的是loc_ptr的值以任何方式发生变化(正如我使用调试器验证的那样)。所以,要么你仍然看到鬼,或者你的示例代码没有表现出你所遇到的问题(以它为例来说它毫无价值)。我的建议(见上面的链接)仍然存在。

答案 1 :(得分:2)

堆栈损坏?检查options [] locations []数组的大小。使用断言以避免超出界限也很好。

所以,现在我看到了索引的问题。 locations []数组有3个元素,但你在第一个循环中访问第四个元素(loc_ptr [position] - &gt; loc_ptr [3]),与options []相同。

答案 2 :(得分:1)

形成代码,似乎第一次调用不存在的元素位置[3]。这有意义吗?

答案 3 :(得分:0)

您无法访问位置[3],因为该数组中的最高索引是2.您可能想要:

for (int i = 2;i >= 0;i--) 
    options[i] = calculate_distance(current_location, locations[i]);
}

答案 4 :(得分:0)

问题似乎在

loc_ptr = &locations[0];

locations似乎是location元素的数组。获取此数组的第一个元素的地址将为您提供指向此元素的指针。

为什么不只是locations[position]而不是创建额外的loc_ptr来保存相同的信息?我很确定问题与locations的内容有关 - 这也不在您的代码段范围内。