在此代码中:
#include <stdio.h>
struct iter_obj
{
void *iterable;
};
#define new_iter_obj(iter) {iter}
void *array_item(int index, void *iterable)
{
if (index < 10)
{
return (void *) &(((int *) iterable)[index]);
}
else
{
return NULL;
}
}
void iterate(struct iter_obj *obj)
{
void *tmp;
int index = 0;
while ((tmp = array_item(index, obj->iterable)) != NULL)
{
printf("%d\n", *((int *) tmp));
index++;
}
}
int main()
{
int countdown[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
struct iter_obj cd_iter = new_iter_obj((void *) countdown);
iterate(&cd_iter);
}
输出应为:
10
9
8
7
6
5
4
3
2
1
但是:没有输出。
问题是,main
中的倒计时数组和iterable
的{{1}}参数应该相等 - 但array_item
最终为NULL(我通过使用适当的调试器通过我的代码和来调试宏。我在调试时没有发现我的代码有任何问题 - 似乎这几乎是随机的。
如果我更改代码以便我直接传递iterable
而不是通过结构,则指针保持不变(正确输出)。
为什么?它是C99的一部分,是lcc越野车,还是什么?
我在Windows 8.1上使用lcc-win32 3.8(C99)。
我发现我的代码在Pelles C 8.00 RC1中正常工作。
答案 0 :(得分:2)
我能提出的唯一可行解决方案是更新编译器或获取新编译器。
答案 1 :(得分:2)
您的编译器无法正确编译以下代码。应该举行断言,但是lcc有cd_iter.iterable == NULL
。
#include <stdio.h>
#include <assert.h>
struct iter_obj
{
int *iterable;
};
int main()
{
int countdown[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
struct iter_obj cd_iter = { countdown };
assert(cd_iter.iterable == countdown);
}