2011-08-24 125 views
-1

关于该代码:C语言:为什么我得到NULL?

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

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

大小只是表的大小。

即时通讯以初始化所有单元

阵列为NULL发送这些veriables到一个函数。

这一行:使用Eclipse调试器我可以看到,该数组中的对象是INFACT

被初始化为NULL

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

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

它们发送到该功能,但是当方法结束时,

tp-> table为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

这是哪一个? C还是C++?我给你的建议将会*非常*不同,取决于它是哪一个。 – Flexo

+1

请发布'struct'。 – 2011-08-24 15:34:26

+0

为什么你在返回'void'的函数中返回一些东西? – Constantinius

回答

0

数组和指针是相似但不同。

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

在这种情况下,tp-> table与tp-> 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)) 

所以你的调试器实际上可能会打印出巾>表是完全等同于巾 - >表将取决于你的编译器的实现[0]。

0

的代码提交似乎是错误的(你是返回从void函数的东西!),但我m会冒昧地猜测,并假设在你的实际代码中,你试图在initArr中设置“array”为某些东西(可能是通过malloc),在这种情况下,我们有一个经典的问题:你正在传递tp-> table现在你 -

卫生署:按值,所以它不会被initArr改变:initArr上巾>表的本地副本,当initArr结束:)

编辑并抛弃工作发布了更新,看起来我的猜测是错误的。 :/如果我说得对,想象一下荣誉! :)

+0

我编辑了我的代码,这是一个错误。 – Itzik984