您好我有这个问题。我做了这个功能:
void* deque2array(tDeque * D){
void *arr = NULL;
int i;
tNodo * aux = D->ppio;
for(i=0; i < D->cant; i++){
arr = aux->elem;
arr++;
aux=aux->sig;
}
return arr;
}
然后我做了一个测试人员以确保这个功能正常工作。
tDeque * queue = createDeque();
int x=5;
int y=2;
int z=3;
insertInDeque(queue, &x);
insertInDeque(queue, &y);
insertInDeque(queue, &z);
int* pointer = deque2array(queue);
int i;
for(i=0; i<numberOfElements(queue); i++){
pointer = pointer + i;
printf(" %d ", *pointer);
}
但我得到的只是记忆地址,我不知道我做错了什么。
答案 0 :(得分:1)
你做错了几件事。首先,您要发布一个不完整的代码示例。我们不知道D->ppio
,D->cant
,aux->sig
或aux->elem
是什么,我们也不知道您是否在insertInDeque
中正确设置了它们
在deque2array
:
arr = aux->elem
你可能想要:
*arr = aux->elem
否则,该函数返回存储在最后aux->elem
+ 1中的值。如果它应该返回{{{},则很难理解如何在没有异常的情况下运行它。 1}}。
在你的测试员中:
void*
您正在循环的每次迭代中修改pointer = pointer + i
。因此,循环的第N次迭代的pointer
是pointer
的原始值加上整数0到N的和,而不是pointer
的原始值加上pointer
似乎是有意的。同样,如果此代码在没有异常的情况下运行,那将是一个奇迹,因为它将读取超出数组边界的内存。如果返回值足够大i
,则可以保证产生错误。
一旦你解决了这些问题,如果我认为numberOfElements(queue)
是我认为的那样,aux->elem
做了我认为它做的事,你的新问题就是你要插入insertInDeque
,x
和y
到结构中的地址,而不是值,因此对于校正的测试代码来说,打印变量的地址是有意义的。截至目前,由于您正在读取未定义的内存位置,因此无论数据结构中的实际内容如何,结果都没有意义。