#c #winapi
#c #winapi
Вопрос:
когда я пытаюсь создать массив:
EVENTLOGRECORD logs[] = new EVENTLOGRECORD[dwEventLogRecords];
выдает ошибку ‘conversion’: не удается преобразовать из ‘type1’ в ‘type2’ я не знаю, как это исправить, пожалуйста, помогите.
#include <Windows.h>
void main() {
DWORD dwEventLogRecords;
HANDLE hEventLog = OpenEventLogA(0,"System");
GetNumberOfEventLogRecords(hEventLog, amp;dwEventLogRecords);
int numberOfBytes = sizeof(EVENTLOGRECORD)*dwEventLogRecords;
EVENTLOGRECORD logs[] = new EVENTLOGRECORD[dwEventLogRecords];
ReadEventLog(hEventLog, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ,0,logs, numberOfBytes, 0, 0);
}
Комментарии:
1.
EVENTLOGRECORD logs[] = new EVENTLOGRECORD[dwEventLogRecords];
должно бытьEVENTLOGRECORD *logs = new EVENTLOGRECORD[dwEventLogRecords];
2. да, но я хочу массив, а не указатель
3. Вы получите указатель, указывающий на нужный вам массив.
4. Вы не можете инициализировать массив с помощью указателя.
new[]
возвращает указатель. Вы должны сохранить результат в переменной-указателе. Вы все еще можете получить доступ к элементам массива, используя синтаксис, подобный массиву, через[]
.5. как получилось, что это работает для целых чисел, например, int logs [] = new int [10]; ??????
Ответ №1:
В C нет неявного преобразования указателей на типы массивов. Они похожи, но не идентичны. Массивы могут распадаться на указатели, но это не работает наоборот, поскольку информация теряется в пути — указатель просто представляет адрес памяти, в то время как массив представляет адрес непрерывной области, обычно определенного размера.
Я предлагаю прочитать раздел 6 c-faq.
Кроме того,
type *a and type b[]
a
это переменная, которой необходимо выделить место в памяти для хранения, в то время как b
это метка в программе, которая предоставляет адресную информацию компилятору без сохранения. Таким образом, вы можете изменить a
в программе, но вы не можете изменить b
то, что не поддается изменению.