无法弄清楚seg故障的原因是什么

时间:2016-04-08 05:41:11

标签: c segmentation-fault

这里的总C菜鸟。难以定位此seg故障的原因。我试过运行调试器GBD调试器,但我无法弄清楚如何让它工作。我正在尝试测试的函数删除数组的内容,将其放入链表中,然后将链表的值放入给函数的第二个数组中。继承我的测试和功能代码。

测试

int test_transfer(void) {
    #define ARRAY_LENGTH 10
    void *arr1[ARRAY_LENGTH];
    for (int i = 0; i < ARRAY_LENGTH; i++) {
        arr1[i] = &i;
    }

    void *ptr;
    void *arr2[ARRAY_LENGTH];
    for (int i = 0; i < ARRAY_LENGTH; i++) {
        arr2[i] = ptr;
    }

    transfer(arr1, arr2, ARRAY_LENGTH, sizeof(int), add_to_front, remove_from_front);

    for (int i=0; i < ARRAY_LENGTH; i++) {
        printf("%d\n", *((int *)arr2[i]));
    }

    return 0;
}

转移功能

void transfer(void **arr1, void **arr2, int length, int size, void (*insert)(List *, void *), void* (*remove)(List *)) {
    List *list = List_create();

    for (int i=0; i < length; i++) {
        (*insert)(list, &arr1[i]);
    }

    for (int i=0; i < length; i++) {
        void *indexPtr = arr2 + i*size;
        indexPtr = (*remove)(list);
    }

}

1 个答案:

答案 0 :(得分:1)

在这个循环中

for (int i = 0; i < ARRAY_LENGTH; i++) {
    arr1[i] = &i;
}

你使arr1中的每个元素都指向本地变量i,当我说本地时,我不是指函数中的本地元素,而是本地的在循环的范围内。

上述循环大致相当于

{
    int i;
    for (i = 0; i < ARRAY_LENGTH; i++) {
        arr1[i] = &i;
    }
}

一旦循环结束,变量i超出范围并且不再存在,留下许多迷路指针,当你尝试取消引用这些指针时,你会有未定义的行为< / em>的

另请注意,数组arr1中的所有元素都已初始化为指向相同的位置。

第二个数组arr2有一个不同的问题,即数组中的所有指针都等于未初始化指针ptr。未初始化的局部变量具有 indeterminate 值,并在初始化之前使用它们会导致未定义的行为。

最后,在transfer函数中,您有语句

void *indexPtr = arr2 + i*size;

在不知道remove是什么或它做什么的情况下,表达式arr2 + anything将为您提供指向数组中特定元素的指针,并且因为每个元素又是一个指针,所得到的是指向void **类型指针的指针。