‘инициализация’: не удается преобразовать из ‘EVENTLOGRECORD *’ в ‘EVENTLOGRECORD []’

#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 то, что не поддается изменению.