繁体   English   中英

为指向char的指针分配数字

[英]Assigning numbers to pointers to char

我正在u-boot的netconsole中编写对udp协议的修改(该板是xilinx的zedboard)。

我需要编号包。 我找到了负责发送的功能,我想首先在每个数据包的开头添加一个数字。 只要我用双引号 - “@”传递值,它就可以正常工作。

当我想传递一个数字时(或者即使我使用单个字符 - '@'而不是“@”),当我收到数据包时,我会得到完全随机的值。

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是指向char的类型。

文字"@"是一个字符串,表示为指向char的指针。

文字'@'是一个字符。

当你说uchar * prefix = "@" ,你正在指定一个指向指针的指针,一切都按预期发生。 当您说uchar * prefix = '@' ,您隐式将该ASCII字符(0x40)的数值转换为指针。 当您取消引用该指针时,您将获得在内存地址0x40处发生的任何事情,这可能不是您尝试做的事情。 如果您在编译时打开了所有警告,则编译器应标记隐式转换。

您有两种可能的解决方案。 要么使用字符串文字而不是字符,要么将prefix更改为char类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM