Вы только что обнаружили, почему это:
typedef unsigned char mac_t[6];
плохо.Зачем?Потому что mac_t это массив.Посмотрите на это:
void mac_print(mac_t mac);
Как вы думаете, что это значит?Это функция, которая принимает тип mac_t
?Не совсем, это означает, что указатель берется.
// all forms mean the same
void mac_print(mac_t mac);
void mac_print(unsigned char mac[6]);
void mac_print(unsigned char mac[]);
void mac_print(unsigned char *mac);
, потому что объявление массивов внутри списка параметров функции настроено на тип указателя, см. здесь и здесь ,
Лучший способ исправить ваш код - это структура:
typedef struct {
unsigned char v[6];
} mac_t;
Теперь вы знаете, что такое mac_t
.И вы также будете знать, как его индексировать.Вы также можете легко выполнить задание mac_t a; mac_t b; a = b;
и сравнение !memcmp(&a, &b, sizeof(a))
(memcmp нужно немного потренироваться, но к нему можно привыкнуть).
Попробуйте это:
typedef struct {
unsigned char v[6];
} mac_t;
void mac_print(mac_t mac);
int main(void) {
mac_t macs[3]={0};
//mac1
macs[0].v[0]=0x00;
macs[0].v[1]=0x00;
macs[0].v[2]=0x00;
macs[0].v[3]=0x00;
macs[0].v[4]=0x00;
macs[0].v[5]=0x00;
//mac2
macs[1].v[0]=0x01;
macs[1].v[1]=0x01;
macs[1].v[2]=0x01;
macs[1].v[3]=0x01;
macs[1].v[4]=0x01;
macs[1].v[5]=0x01;
//mac3
macs[2].v[0]=0x02;
macs[2].v[1]=0x02;
macs[2].v[2]=0x02;
macs[2].v[3]=0x02;
macs[2].v[4]=0x02;
macs[2].v[5]=0x02;
// we pass by value here, but it would be better to pass a pointer
// ie. `void mac_print(mac_t *mac);` and `mac_print(&macs[0]);`
mac_print(macs[0]);
mac_print(macs[1]);
mac_print(macs[2]);
}
void mac_print(mac_t mac) {
printf("%02x:%02x:%02x:%02x:%02x:%02x\n",mac.v[0],mac.v[1],mac.v[2],mac.v[3],mac.v[4],mac.v[5]);
}