将 char 指针传递给 C 中的函数
Pass char pointer to function in C
我正在尝试通过此代码获取 Mac 地址:
void getMacAdress(unsigned char **address)
{
int s;
struct ifreq buffer;
s = socket(PF_INET, SOCK_DGRAM, 0);
memset(&buffer, 0x00, sizeof(buffer));
strcpy(buffer.ifr_name, "eth0");
ioctl(s, SIOCGIFHWADDR, &buffer);
close(s);
*address = (unsigned char *)buffer.ifr_hwaddr.sa_data;
for (s = 0; s < 6; s++)
{
printf("%.2X ", *(*address + s));
}
printf("\n");
}
int main(int argc, char *argv[])
{
unsigned char *address;
getMacAdress(&address);
int i;
for (i = 0; i < 6; i++)
{
printf("%.2X ", *(address + i));
}
printf("\n");
return 0;
}
我得到了正确的结果
08 00 27 0A 4E 98
08 00 27 0A 4E 98
但是当我删除 getMacAddress()
函数中的 printf
片段代码时,它变成了:
void getMacAdress(unsigned char **address)
{
int s;
struct ifreq buffer;
s = socket(PF_INET, SOCK_DGRAM, 0);
memset(&buffer, 0x00, sizeof(buffer));
strcpy(buffer.ifr_name, "eth0");
ioctl(s, SIOCGIFHWADDR, &buffer);
close(s);
*address = (unsigned char *)buffer.ifr_hwaddr.sa_data;
printf("\n");
}
我得到了错误的结果
08 00 00 00 00 00
你能解释一下这是为什么吗?我该如何解决这个问题?
问题在这里:
*address = (unsigned char *)buffer.ifr_hwaddr.sa_data;
buffer
是函数的局部变量。因此,您存储在 address
中的指针指向一个局部变量,该变量在函数 returns 时被销毁,留下一个悬空指针。
尝试从此指针读取会导致未定义的行为。您的输出可以根据您打印时内存是否已被重新用于其他用途来解释。
如果你想修复它...
//*address = (unsigned char *)buffer.ifr_hwaddr.sa_data;
*address = malloc (strlen (buffer.ifr_hwaddr.sa_data) + 1);
strcpy (*address, buffer.ifr_hwaddr.sa_data);
您不能在函数中指向堆栈 space 到 return。
相反,您可以 malloc 一个堆 space 来存储您想要的结果:
void getMacAdress(unsigned char **address)
{
int s;
struct ifreq buffer;
s = socket(PF_INET, SOCK_DGRAM, 0);
memset(&buffer, 0x00, sizeof(buffer));
strcpy(buffer.ifr_name, "eth0");
ioctl(s, SIOCGIFHWADDR, &buffer);
close(s);
*address = (unsigned char*) malloc(sizeof(buffer.ifr_hwaddr.sa_data));
memcpy(*address, buffer.ifr_hwaddr.sa_data,sizeof(buffer.ifr_hwaddr.sa_data));
//for (s = 0; s < 6; s++)
//{
// printf("%.2X ", *(*address + s));
//}
//printf("\n");
}
顺便说一句,不要忘记在主函数中释放堆 space。
我正在尝试通过此代码获取 Mac 地址:
void getMacAdress(unsigned char **address)
{
int s;
struct ifreq buffer;
s = socket(PF_INET, SOCK_DGRAM, 0);
memset(&buffer, 0x00, sizeof(buffer));
strcpy(buffer.ifr_name, "eth0");
ioctl(s, SIOCGIFHWADDR, &buffer);
close(s);
*address = (unsigned char *)buffer.ifr_hwaddr.sa_data;
for (s = 0; s < 6; s++)
{
printf("%.2X ", *(*address + s));
}
printf("\n");
}
int main(int argc, char *argv[])
{
unsigned char *address;
getMacAdress(&address);
int i;
for (i = 0; i < 6; i++)
{
printf("%.2X ", *(address + i));
}
printf("\n");
return 0;
}
我得到了正确的结果
08 00 27 0A 4E 98
08 00 27 0A 4E 98
但是当我删除 getMacAddress()
函数中的 printf
片段代码时,它变成了:
void getMacAdress(unsigned char **address)
{
int s;
struct ifreq buffer;
s = socket(PF_INET, SOCK_DGRAM, 0);
memset(&buffer, 0x00, sizeof(buffer));
strcpy(buffer.ifr_name, "eth0");
ioctl(s, SIOCGIFHWADDR, &buffer);
close(s);
*address = (unsigned char *)buffer.ifr_hwaddr.sa_data;
printf("\n");
}
我得到了错误的结果
08 00 00 00 00 00
你能解释一下这是为什么吗?我该如何解决这个问题?
问题在这里:
*address = (unsigned char *)buffer.ifr_hwaddr.sa_data;
buffer
是函数的局部变量。因此,您存储在 address
中的指针指向一个局部变量,该变量在函数 returns 时被销毁,留下一个悬空指针。
尝试从此指针读取会导致未定义的行为。您的输出可以根据您打印时内存是否已被重新用于其他用途来解释。
如果你想修复它...
//*address = (unsigned char *)buffer.ifr_hwaddr.sa_data;
*address = malloc (strlen (buffer.ifr_hwaddr.sa_data) + 1);
strcpy (*address, buffer.ifr_hwaddr.sa_data);
您不能在函数中指向堆栈 space 到 return。
相反,您可以 malloc 一个堆 space 来存储您想要的结果:
void getMacAdress(unsigned char **address)
{
int s;
struct ifreq buffer;
s = socket(PF_INET, SOCK_DGRAM, 0);
memset(&buffer, 0x00, sizeof(buffer));
strcpy(buffer.ifr_name, "eth0");
ioctl(s, SIOCGIFHWADDR, &buffer);
close(s);
*address = (unsigned char*) malloc(sizeof(buffer.ifr_hwaddr.sa_data));
memcpy(*address, buffer.ifr_hwaddr.sa_data,sizeof(buffer.ifr_hwaddr.sa_data));
//for (s = 0; s < 6; s++)
//{
// printf("%.2X ", *(*address + s));
//}
//printf("\n");
}
顺便说一句,不要忘记在主函数中释放堆 space。