#include <stdio.h>
typedef unsigned char mac_t[6];
void mac_print(mac_t mac);
int main(void) {
mac_t macs[3]={0};
//mac1
macs[0][0]=0x00;
macs[1][0]=0x00;
macs[2][0]=0x00;
macs[3][0]=0x00;
macs[4][0]=0x00;
macs[5][0]=0x00;
//mac2
macs[0][1]=0x01;
macs[1][1]=0x01;
macs[2][1]=0x01;
macs[3][1]=0x01;
macs[4][1]=0x01;
macs[5][1]=0x01;
//mac3
macs[0][2]=0x02;
macs[1][2]=0x02;
macs[2][2]=0x02;
macs[3][2]=0x02;
macs[4][2]=0x02;
macs[5][2]=0x02;
mac_print(*(macs));
mac_print(*(macs+1));
mac_print(*(macs+2));
}
void mac_print(mac_t mac) {
printf("%02x:%02x:%02x:%02x:%02x:%02x\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
}
假设需要类型mac-print
,如何在函数mac_t
中打印mac1,mac2和mac3?
答案 0 :(得分:2)
您刚刚发现了为什么:
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);
因为函数parameter-list中的数组声明被调整为指针类型,请参见here和here。
修复代码的最佳方法是使用结构:
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]);
}
答案 1 :(得分:1)
应该是:
group By VotingValue
答案 2 :(得分:0)
“ macs”变量在英语中的实际定义是:
An array with three slots of arrays with six slots.
您当前的用法假定为:
An array with six slots of arrays with three slots.
因此,数组的尺寸实际上是3 x 6,而不是6 x 3(当前使用)。
此初始值设定项可能有助于构建更可靠的思维模型:
mac_t macs[3] =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
{ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02},
};
最后,printf语句需要做更多的工作,因为您当前正在引用数组的插槽(仅指定1个索引),而不是数组数组中的各个字节。