Указатель на массив структур в C - PullRequest
0 голосов
/ 24 июня 2011

Пожалуйста, дайте мне знать, как я могу передать указатель на массив структур в C в качестве аргумента функции.

Ниже мой код.

#include <stdio.h>
#include<strings.h>



typedef struct _Alert
{
    char   MerchantNo[21];
    time_t last_update;
} Alert;
typedef Alert *PALERT;


int set(PALERT palertMerch[5], int *merchnoIndex, char * txnMerchant)
{
    strcpy(palertMerch[*merchnoIndex]->MerchantNo, txnMerchant);
    *(merchnoIndex) = *(merchnoIndex) + 1 ;

    return 0;
}

int main()
{
    Alert alert[5];

    for(int i =0; i<5;i++)
    {
        memset(alert[i].MerchantNo, 0x00, 21);
        alert[i].last_update = (time_t)0;
    }

    char *p = "SACHIN";
    int index = 0;
    set(alert[5], index, p);
}

Сообщение об ошибке

"3.c", line 34: argument #1 is incompatible with prototype:
        prototype: pointer to pointer to struct _Alert {array[21] of char MerchantNo, long last_update} : "3.c", line 14
        argument : struct _Alert {array[21] of char MerchantNo, long last_update}
"3.c", line 34: warning: improper pointer/integer combination: arg #2
cc: acomp failed for 3.c

Ответы [ 4 ]

5 голосов
/ 24 июня 2011

Вы просто передадите массив, он получит распад на указатель на первый элемент массива:

set( alert, &index, p );

Обратите внимание, что я также исправил вашу вторую ошибку передачи целого числа какуказатель на второй аргумент.

Редактировать 0:

Я пропустил объявление PALERT - ваше определение функции неверно, должно быть что-то вроде:

int set( PALERT palertMerch, int* merchnoIndex, const char* txnMerchant )
{
    assert( *merchnoIndex >= 0 && *merchnoIndex < 5 );
    strcpy( palertMerch[*merchnoIndex].MerchantNo, txnMerchant );
    ...
}

Я знаю, что массивы и указатели немного запутаны в C, и вы уже пытались перейти к массивам указателей:)

3 голосов
/ 24 июня 2011

Вы на самом деле не можете передать массив в функцию.Что происходит, когда вы это делаете, это то, что вместо этого передается указатель на первый элемент в массиве.(Этот процесс часто описывается как «массив распадается на указатель»).

То есть

set(alert, index, p);

Это то же самое, что и:

set(&alert[0], index, p);

(Обратите внимание, что вы назвали его как set(alert[5], index, p);, это просто передает элемент 6. вашего массива, что, кстати, является недопустимым, поскольку в вашем массиве есть место только для 5 элементов.)

Итак, что вы делаетекогда вы хотите передать массив функции, вы

  1. передаете указатель на первый элемент массива (это можно сделать, просто написав name_of_array или &name_of_array[0]
  2. Добавьте еще один аргумент, который является длиной массива. Это может понадобиться, как если бы ваш массив мог иметь разные размеры, и вы не можете знать, сколько элементов в массиве, если все, что вы получили, это указатель на его первый элемент:

Давайте пока пропустим пункт 2. выше, вы можете просто сделать:

    //PALERT is already a pointer, otherwise specify the first argument as:
    //ALERT *palertMerch
    int set(PALERT palertMerch, int *merchnoIndex, char * txnMerchant) 
    {
        strcpy(palertMerch[*merchnoIndex]->MerchantNo, txnMerchant);
        *(merchnoIndex) = *(merchnoIndex) + 1 ;

        return 0;
    }

И назвать это как:

char *p = "SACHIN";
int index = 0;
set(alert, index, p);

Кстати, если у вас нетхорошая причина, старайтесь не скрывать указатель в typedef, как это делается в typedef Alert *PALERT;, что часто приводит к путанице.

0 голосов
/ 24 июня 2011

Ваша функция принимает тип PALERT * [5].Вместо этого вы переходите в Alert [5].Существуют и другие проблемы с вашим кодом, которые необходимо исправить, прежде чем он будет успешно запущен.

0 голосов
/ 24 июня 2011

уберите скобки массива и все должно работать. Причина этого заключается в том, что запись массива является более простым способом представления последовательностей элементов в памяти. Например, в массиве a [5] вы можете получить доступ к третьему элементу как [3] или * (a + 3).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...