这里是全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/