一种方法会导致段错误,另一种方法则不会。有什么不同?

时间:2018-05-22 20:32:38

标签: c pointers segmentation-fault

我的源代码包含类似于以下内容的细分:

double ****A;

my_function(A);

会在my_function中抛出段错误。

然而,当我将其替换为:

double ***A;

my_function(&A);

然后my_function有效。我原以为my_function在两种情况下都会看到相同的参数。

2 个答案:

答案 0 :(得分:2)

假设:

double ****A;

my_function(A);

并假设这些行显然在您的代码中,没有赋值给A,我们可以确定您将未初始化的值(垃圾指针)传递给my_function 。这本身就有不明确的行为。它是否导致分段错误取决于my_function对该值的影响。

此:

double ***A;

my_function(&A);

传递类型为double****的有效值。该值是声明对象的地址。呼叫本身就完全有效。 (这可能会导致细分错误,具体取决于my_function对它的作用,但您还没有向我们展示my_function的作用,因此我不会进一步推测。)

编辑:我刚刚注意到短语"类似于以下"在你的问题。如果没有看到您的完全代码,我们就不知道您遗漏了什么,而您的问题基本上无法回答。 (如果我最初注意到这一点,我就不会发布这个答案。)

答案 1 :(得分:2)

这:u = User.find_by(name: 'mateusz') 未设置为指向任何内容。它是一个没有已知值的悬空指针。

这个:double ****A;这是你的函数调用所做的,将B指向A的存储,所以指针实际指向存在的东西。