【问题标题】:C type conversion between NULL and integerNULL和整数之间的C类型转换
【发布时间】:2011-11-22 23:10:28
【问题描述】:

我有一个关于 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));

【问题讨论】:

标签: c types null integer


【解决方案1】:

NULL 是代表空指针 的宏,而不是整数。您正在做的是最普遍和最痛苦的滥用行为之一,它让 C++ 标准化者头疼不已。

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

int n = 0;

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

您需要以下两项之一:

Frame frameTable[2];  // automatic storage

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

【讨论】:

  • 但是既然这些是索引,它们被初始化为 0 不会干扰索引吗?我将检查它们的值,0 可能会与第一个元素混淆。
  • @JojoJonas:对不起,我不明白这个问题。为什么任何事情都会干扰任何人? frameTable[i]*(frameTable + i) 相同...
  • 所以这是我的索引被使用的地方。 if (frameTable[i].lv2Index == (int) NULL) {
  • @JojoJonas:对不起,我仍然不知道问题出在哪里。无论如何,您的代码应该是 frameTable[i].lv2Index = 0if (frameTable[i].lv2Index == 0) 等。
  • 我想我解释得不好。对不起。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    NULL 用于指针,而不是整数。虽然您可以强制强制转换任何内容,但最好将它们设置为 0 时更加明确和准确。

    在分配 frameTable(s) 时,您也可以通过调用内存(而不是 mallocing)来获得相同的效果。 Calloc 将其分配的内存中的所有字节清除为 0。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-08-18
        • 2015-11-26
        • 1970-01-01
        • 1970-01-01
        • 2012-11-02
        • 1970-01-01
        • 2021-12-06
        • 1970-01-01
        • 2019-06-23
        相关资源
        最近更新 更多