【问题标题】:Segmentation Fault on Identical Code [duplicate]相同代码的分段错误[重复]
【发布时间】:2016-02-28 22:51:10
【问题描述】:

我有一个案例,我使用两组不同的变量调用了两次函数。第一次调用导致分段错误,第二次调用成功返回。

参数相同,只是缺少变量名。这种行为的原因可能是什么?

#include <stdio.h>
#include <stdlib.h>
#include "euler-v2.h"

#define POWER 1000

int main(void)
{
    int i;

    int base[] = { 2 };
    int *r;
    int *rlength;

    // The below line causes a segmentation fault
    r = power_arr(base, sizeof(base) / sizeof(int), 2, rlength);

    int n[] = { 2 };
    int *pow;
    int *length;

    pow = power_arr(n, sizeof(n) / sizeof(int), 2, length);


    exit(0); 
}

单独头文件中的函数原型:

int *power_arr(int *n, int nlength, int exp, int *res_length);

我无法辨别对power_arr 的第一次呼叫和第二次呼叫之间的任何区别。了解这里到底发生了什么?

编辑:

函数power_arr的来源:

int *power_arr(int *n, int nlength, int exp, int *res_length)
{
    int i, j, tmp_length;
    int *res, *tmp;

    res = n;

    printf("Step 1\n"); // Last printed line
    *res_length = nlength;
    printf("Step 2\n"); // Never reaches here

    while (--exp > 0)
    {
        tmp_length = *res_length;
        tmp = malloc(sizeof(int) * tmp_length);

        if (!tmp)
        {
            return NULL;
        }

        copy(tmp, res, *res_length);

        for (i = *n - 1; i > 0; i--)
        {
            res = sum(res, *res_length, tmp, tmp_length, res_length);
        }

        if (!res)
        {
            return NULL;
        }

            free(tmp);
    }
        return res;
}

注意,我已经放置到printf 语句进行调试。我已经评论了代码执行失败的地方。

【问题讨论】:

  • 你能发布power_arr的实现吗?问题可能就在那里...
  • 我不太明白如果第一次调用出现段错误,如何进行第二次调用。这是您的代码还是“类似于我的代码”?
  • @Weather Vane。我的道歉。我最初有第一个电话 - 它产生了分段错误。在此之前,我在另一个源文件中测试了函数调用,所以我只是复制了语句块(变量和第二个函数调用)。注释掉第一个,成功重新运行第二个。当我在几秒钟前测试通话时,我对通话失败的原因感到摸不着头脑。包含这两个调用是为了表明我使用了相同的变量类型和调用约定。
  • 您永远不会为rlength 分配任何指向的空间。所以power_arr() 是通过一个未初始化的指针间接实现的。
  • @Barmer。这完全有道理,但是,为什么第二次调用每次都会成功? *length 也是一个未初始化的指针。此外, *rlength 在 power_arr 中初始化;调用 `*res_length = nlength.

标签: c pointers segmentation-fault


【解决方案1】:

程序具有未定义的行为,因为指针 rlength 未初始化并且具有不确定的值。

int *rlength;

另一方面,在函数中,您尝试使用此指针写入未分配的内存。

*res_length = nlength;

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2020-03-07
    • 1970-01-01
    相关资源
    最近更新 更多