c - 将数字分配给指向 char 的指针

标签 c udp u-boot

我在u-boot的netconsole(板子是xilinx的zedboard)中写一个udp协议(protocol)的修改。

我需要给数据包编号。我找到了负责发送的函数,我想首先在每个数据包的开头添加一个数字。它工作得很好,只要我用双引号传递值 - “@”。

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

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 是 pointer-to-char 类型。

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

文字 '@' 是一个字符。

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

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

关于c - 将数字分配给指向 char 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27851640/

相关文章:

c - Intel(x86_64) 64位与32位整数运算性能差异

c - 每两个字符反转输入

java - 仅在第一次运行时接收来自 Java 的 UDP 消息

embedded-linux - 如何将uboot烧录到板载NAND闪存上

linux - U-boot 在不同的内核上加载两个图像

linux - u-boot 的控制权如何转移到 Linux 内核?

c - 错误: invalid operands to binary + (have 'int (*)()' and 'int (*)()' )

C 程序要求两个单独的文件,然后显示字符数、行数和单词数

Java 为什么 DatagramPacket 的构造函数需要字节数组的长度?

c - 将 UDP 数据包识别为不同的连接