NULL和整数之间的C类型转换

时间:2011-11-22 23:10:28

标签: c types null integer

我对C中的类型转换有疑问。

所以,我正在使用这些代码行将我的索引值初始化为NULL:

frameTable[i].lv1Index = (int) NULL;
frameTable[i].lv2Index = (int) NULL;

其中frameTable由以下内容构成:

typedef struct {
    int lv2Index, lv1Index;
} Frame;

Frame* frameTable;

有谁能告诉我这有什么问题?

这是我的记忆分配:

    frameTable = (Frame*) malloc(frameTableSize * sizeof(Frame));

4 个答案:

答案 0 :(得分:4)

NULL是一个表示空指针的宏,而不是整数。你正在做的是最广泛和最痛苦的滥用之一,导致C ++标准化者头痛不已。

如果希望整数为零,请使用八进制0字面值:

int n = 0;

接下来,您的代码很好,但缺少分配frameTable[i]变量存储在哪里?

您需要以下两种之一:

Frame frameTable[2];  // automatic storage

Frame * frameTable = malloc(sizeof(Frame) * 2);   // manual, your responsibility now

答案 1 :(得分:3)

这可能会正确编译和执行,因为您将NULL转换为int(即,编译器假定您知道您正在做什么),但NULL旨在与指针一起使用。由于您的结构字段是整数,只需将它们设置为零即可初始化它们(" frameTable [i] .lv1Index = 0;")。如果您想表明它们还不是有效索引,则将它们设置为-1或其他一些无效值。

答案 2 :(得分:2)

NULL用于指针,而不是int。虽然你可以强制推送几乎任何东西,但你最好更明确,更准确地将它们设置为0。

当你分配你的frameTable时,你也可以通过calloc'ing内存(而不是mallocing)来获得相同的效果。 Calloc将其分配的内存中的所有字节清除为0。

答案 3 :(得分:0)

在c中,除了指针之外,你不能将c对象设置为NULL。您不能将NULL转换为其他对象,因为它不会封装任何内容。因此,您可能希望将struct变量设置为0而不是NULL。