将数字分配给指向 char 的指针
Assigning numbers to pointers to char
我正在u-boot的netconsole(板子是xilinx的zedboard)中写一个udp协议的修改。
我需要给数据包编号。我找到了负责发送的函数,我想首先在每个数据包的开头添加一个数字。它工作得很好,只要我用双引号传递值 - "@".
当我只想传递一个数字时(或者即使我使用单个字符 - '@' 而不是“@”),我在收到数据包时会得到完全随机的值。
static void nc_send_packet(const char *buf, int len)
{
struct eth_device *eth;
int inited = 0;
uchar *pkt;
uchar *ether;
IPaddr_t ip;
uchar *new_buf=malloc((len+1)*(sizeof(uchar))); //TN
uchar *prefix="@"; //<-------------------------------this line TN
memcpy(new_buf, prefix, 1); //TN
memcpy((new_buf+1), buf, len); //TN
len+=1; //TN
debug_cond(DEBUG_DEV_PKT, "output: \"%*.*s\"\n", len, len, buf);
eth = eth_get_dev();
if (eth == NULL)
return;
if (!memcmp(nc_ether, NetEtherNullAddr, 6)) {
if (eth->state == ETH_STATE_ACTIVE)
return; /* inside net loop */
output_packet = new_buf; //TN was output_packet = buf;
output_packet_len = len;
NetLoop(NETCONS); /* wait for arp reply and send packet */
output_packet_len = 0;
free(new_buf); //TN
return;
}
if (eth->state != ETH_STATE_ACTIVE) {
if (eth_is_on_demand_init()) {
if (eth_init(gd->bd) < 0)
free(new_buf); //TN
return;
eth_set_last_protocol(NETCONS);
} else
eth_init_state_only(gd->bd);
inited = 1;
}
pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE;
memcpy(pkt, new_buf, len); //TN was memcpy(pkt, buf, len);
ether = nc_ether;
ip = nc_ip;
NetSendUDPPacket(ether, ip, nc_out_port, nc_in_port, len);
free(new_buf);//TN
if (inited) {
if (eth_is_on_demand_init())
eth_halt();
else
eth_halt_state_only();
}
}
带 //TN 的行是我添加的。我需要这样的东西:
uchar * prefix = 0x40;
或 uchar * prefix = 64;
更奇怪的是(至少对我而言)
uchar * prefix = '@';
也不起作用。我试过投射它,但 uchar * prefix = (uchar)0x40;
和 uchar * prefix = (uchar)'@';
都不起作用。
我也想知道,是否可以为此设置一个更长的字段,例如,我有 2 个字节用于数据包编号,而不是只有一个。
你的问题是你的数据类型。
您的变量 uchar * prefix
是指向字符的指针类型。
文字 "@"
是一个字符串,表示为指向字符的指针。
文字 '@'
是一个字符。
当您说 uchar * prefix = "@"
时,您正在将一个指针分配给一个指针,并且一切都按预期发生。当您说 uchar * prefix = '@'
时,您正在隐式地将 ASCII 字符 (0x40) 的数值转换为指针。当您取消引用该指针时,您将获得内存地址 0x40 处的任何内容,这可能不是您想要做的。如果您在编译时打开了所有警告,您的编译器应该已经标记了隐式转换。
您有两种可能的解决方案。使用字符串文字而不是字符,或者将 prefix
改为类型 char
。
我正在u-boot的netconsole(板子是xilinx的zedboard)中写一个udp协议的修改。
我需要给数据包编号。我找到了负责发送的函数,我想首先在每个数据包的开头添加一个数字。它工作得很好,只要我用双引号传递值 - "@".
当我只想传递一个数字时(或者即使我使用单个字符 - '@' 而不是“@”),我在收到数据包时会得到完全随机的值。
static void nc_send_packet(const char *buf, int len)
{
struct eth_device *eth;
int inited = 0;
uchar *pkt;
uchar *ether;
IPaddr_t ip;
uchar *new_buf=malloc((len+1)*(sizeof(uchar))); //TN
uchar *prefix="@"; //<-------------------------------this line TN
memcpy(new_buf, prefix, 1); //TN
memcpy((new_buf+1), buf, len); //TN
len+=1; //TN
debug_cond(DEBUG_DEV_PKT, "output: \"%*.*s\"\n", len, len, buf);
eth = eth_get_dev();
if (eth == NULL)
return;
if (!memcmp(nc_ether, NetEtherNullAddr, 6)) {
if (eth->state == ETH_STATE_ACTIVE)
return; /* inside net loop */
output_packet = new_buf; //TN was output_packet = buf;
output_packet_len = len;
NetLoop(NETCONS); /* wait for arp reply and send packet */
output_packet_len = 0;
free(new_buf); //TN
return;
}
if (eth->state != ETH_STATE_ACTIVE) {
if (eth_is_on_demand_init()) {
if (eth_init(gd->bd) < 0)
free(new_buf); //TN
return;
eth_set_last_protocol(NETCONS);
} else
eth_init_state_only(gd->bd);
inited = 1;
}
pkt = (uchar *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE;
memcpy(pkt, new_buf, len); //TN was memcpy(pkt, buf, len);
ether = nc_ether;
ip = nc_ip;
NetSendUDPPacket(ether, ip, nc_out_port, nc_in_port, len);
free(new_buf);//TN
if (inited) {
if (eth_is_on_demand_init())
eth_halt();
else
eth_halt_state_only();
}
}
带 //TN 的行是我添加的。我需要这样的东西:
uchar * prefix = 0x40;
或 uchar * prefix = 64;
更奇怪的是(至少对我而言)
uchar * prefix = '@';
也不起作用。我试过投射它,但 uchar * prefix = (uchar)0x40;
和 uchar * prefix = (uchar)'@';
都不起作用。
我也想知道,是否可以为此设置一个更长的字段,例如,我有 2 个字节用于数据包编号,而不是只有一个。
你的问题是你的数据类型。
您的变量 uchar * prefix
是指向字符的指针类型。
文字 "@"
是一个字符串,表示为指向字符的指针。
文字 '@'
是一个字符。
当您说 uchar * prefix = "@"
时,您正在将一个指针分配给一个指针,并且一切都按预期发生。当您说 uchar * prefix = '@'
时,您正在隐式地将 ASCII 字符 (0x40) 的数值转换为指针。当您取消引用该指针时,您将获得内存地址 0x40 处的任何内容,这可能不是您想要做的。如果您在编译时打开了所有警告,您的编译器应该已经标记了隐式转换。
您有两种可能的解决方案。使用字符串文字而不是字符,或者将 prefix
改为类型 char
。