C语言:为什么我得到NULL?

时间:2011-08-24 15:32:39

标签: c null runtime-error

关于代码:

tp是指向包含表的某个结构的指针。

该表是指向不同结构的指针的指针,用作数组。

大小就是表格的大小。

我将这些序列发送到一个函数,以初始化

中的所有单元格

数组为NULL。

这一行:

initArr(tp->table,tp->size);

将它们发送到此功能:

 void initArr(ObjectP* array,int size)
 {
    int i;
    for (i = 0; i < size; ++i)
    {
        array[i]=NULL;
    }
 }

使用eclipse调试器我可以看到数组中的对象是实际的

被初始化为NULL,但是当方法结束时,

tp-&gt;表为NULL。

指针疯了吗?

请帮忙。

结构:

表:

  typedef struct Table
    {
        size_t size;
        hashFcn hash;
        printFcn print;
        comparisonFcn comp;
        ObjectP* table;
        int duplicated;
    }Table;

对象:

    typedef struct Object
    {
         void *key;
         ObjectP pointsTo;
    }Object;

2 个答案:

答案 0 :(得分:0)

显示的代码似乎错了(你从void函数返回一些东西!),但我会猜测并假设在你的实际代码中,你试图将“数组”设置为某些东西(可能通过malloc)在initArr中,在这种情况下我们有一个经典的问题:你正在通过值传递tp-&gt; table ,因此它不会被initArr更改:initArr在本地副本上运行tp-&gt;表,在initArr结束时被丢弃:)

编辑:

Doh - 现在你发布了更新,看起来我猜错了。 :/如果我做对了,想象一下荣誉! :)

答案 1 :(得分:0)

数组和指针相似但不同。

指针数组可以表示为内存中的多个连续指针(带有数组中第一个指针所在的地址)。

在这种情况下,tp-&gt;表与tp-&gt; table [0]完全相同,但假定为[0](因为它具有相同的地址)。在以这种方式实现的系统中,tp->;表指定一个地址,并且从该地址的偏移量(到达数组的元素)表示为一个值乘以数据类型大小(或一个指针的大小)你的情况)。

tp->table (the base address 0x00000100)
tp->table[0] (the address 0x00000100 + 0 * sizeof(... pointer ...) = 0x00000100)
tp->table[1] (the address 0x00000100 + 1 * sizeof(... pointer ...) = 0x00000104 (some systems only))
tp->table[2] (the address 0x00000100 + 2 * sizeof(... pointer ...) = 0x00000108 (some systems only))

因此,您的调试器实际上可能会打印出tp-&gt;表,这与tp-&gt; table [0]完全等效,具体取决于编译器的实现。