无法弄清楚seg错误的原因是什么

标签 c segmentation-fault

这里是全C菜鸟。很难定位该段故障的原因。我尝试运行调试器 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);
    }

}

最佳答案

在这个循环中

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

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

上面的循环大致相当于

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

一旦循环结束,变量i就会超出范围并且不再存在,从而留下大量杂散指针,当您尝试取消引用这些指针时,您将得到未定义的行为

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

<小时/>

对于第二个数组arr2,您遇到了不同的问题,您使数组中的所有指针等于未初始化指针ptr。未初始化的局部变量具有不确定值,在初始化之前使用它们也会导致未定义的行为。

<小时/>

最后,在transfer函数中你有这样的语句

void *indexPtr = arr2 + i*size;

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

关于无法弄清楚seg错误的原因是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36492339/

相关文章:

c++ - Valgrind `Unsupported arch_prctl option`

c - C函数,使用按位运算来查看int x是否适合n位

c - 我想从显示哪个字符出现最频繁或最不频繁的文本文件中读取(键盘或文本文件)? :)

c - 运行循环 41881 次时出现段错误

尝试打开 .ui 表单编辑器时 Qt Creator 崩溃

c - 使用 fread() 时出现段错误

c - strcmp 的段错误(列表)

c++ - const char * 数组中的元素数

c - itoa 递归地

c - 在标记粘贴的宏上使用#ifdef?