这里的总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);
}
}
答案 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 **
类型指针的指针。