Преобразование типа C между NULL и целым числом - PullRequest
2 голосов
/ 23 ноября 2011

У меня есть вопрос о преобразовании типов в 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 ]

4 голосов
/ 23 ноября 2011

NULL - это макрос, представляющий нулевой указатель , а не целое число. То, что вы делаете, - одно из самых распространенных и болезненных злоупотреблений, которое заставляет стандартизаторов C ++ не прекращать головную боль.

Если вы хотите, чтобы целое число было нулем, используйте восьмеричный 0 литерал:

int n = 0;

Далее ваш код в порядке, но отсутствует выделение . Где хранятся frameTable[i] переменные?

Вам нужно одно из следующих двух:

Frame frameTable[2];  // automatic storage

Frame * frameTable = malloc(sizeof(Frame) * 2);   // manual, your responsibility now
3 голосов
/ 23 ноября 2011

Это, вероятно, будет компилироваться и выполняться правильно, так как вы приводите NULL к int (то есть компилятор предполагает, что вы знаете, что делаете), но NULL предназначен для использования с указателями.Так как ваши поля структуры являются целыми, просто установите их равными нулю, чтобы инициализировать их ("frameTable [i] .lv1Index = 0;").Если вы хотите указать, что они еще не являются действительными индексами, установите для них значение -1 или другое недопустимое значение.

2 голосов
/ 23 ноября 2011

NULL для указателей, а не для целых.В то время как вы можете форсировать приведение практически ко всему, вам лучше быть более точным и точным, установив их в 0.

Вы также можете получить тот же эффект, вызывая calloc'ingпамять (по сравнению с неправильным использованием), когда вы выделяете свои frameTable (s).Calloc очищает все байты до 0 в памяти, которую он выделяет.

0 голосов
/ 23 ноября 2011

В c, кроме указателей, вы не можете установить для объектов c значение NULL. Вы не можете привести NULL к другому объекту, поскольку он ничего не инкапсулирует. Таким образом, вы можете установить свои структурные переменные на 0 вместо NULL.

...