为什么可迭代指针变为NULL?

时间:2014-03-29 12:12:13

标签: c pointers

在此代码中:

#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中正常工作。

2 个答案:

答案 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);
}