我有一个MAC地址数组(char 6),想要选择传递给函数的是哪一个,但对如何区分列和行感到有点困惑。我为一个示例程序想出了这个:
#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中打印mac2、mac3和mac-print,假设类型mac_t是必需的?
发布于 2018-10-03 02:44:30
您刚刚发现了其中的原因:
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。
修复代码的最好方法是使用struct:
typedef struct {
unsigned char v[6];
} mac_t;现在您知道mac_t是什么了。您还将了解如何对其进行索引。你也可以很容易地做assignment mac_t a; mac_t b; a = b;和comparison !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]);
}发布于 2018-10-03 02:42:02
应该是:
#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[0][1]=0x00;
macs[0][2]=0x00;
macs[0][3]=0x00;
macs[0][4]=0x00;
macs[0][5]=0x00;
//mac2
macs[1][0]=0x01;
macs[1][1]=0x01;
macs[1][2]=0x01;
macs[1][3]=0x01;
macs[1][4]=0x01;
macs[1][5]=0x01;
//mac3
macs[2][0]=0x02;
macs[2][1]=0x02;
macs[2][2]=0x02;
macs[2][3]=0x02;
macs[2][4]=0x02;
macs[2][5]=0x02;
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[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
}发布于 2018-10-03 02:42:13
"macs“变量在英语中的实际定义是:
An array with three slots of arrays with six slots.您当前的用法假设定义为:
An array with six slots of arrays with three slots.因此,数组的维数实际上是3x6,而不是6x3(当前使用的)。
这个初始化器可能有助于建立一个更可靠的心理模型:
mac_t macs[3] =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
{ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02},
};最后,printf语句需要更多的工作,因为您当前引用的是数组的槽(仅指定了1个索引),而不是数组数组中的单个字节。
https://stackoverflow.com/questions/52613856
复制相似问题