【问题标题】:Returning an array from function从函数返回一个数组
【发布时间】:2011-06-23 04:40:57
【问题描述】:

我正在编写一个函数,它接收整数值和指向字符的指针。 该函数将整数值转换为二进制并将其存储在 char 指针中。 char 指针长 16 个字节。

代码片段:

void int2bin(u_int16_t addr_IP, char *Binary)
{
    int count;
    printf("IP1add = %d \n", Binary);
    for (count = 0; count < 16; count++) {
        if(addr_IP>0)
            *(Binary + 15-count) = addr_IP & 0x1 ? '1':'0';
        else
            *(Binary + 15-count) = '0';

          addr_IP>>=1;
    }   
}

int main(int argc, char *argv[])
{
    u_int16_t senderIP_16[], u_int16_t receiverIP_16[];
    char  sender_IP_hi[16], sender_IP_low[16];
    int2bin(senderIP_16[0], &sender_IP_hi);
    int2bin(senderIP_16[1], &sender_IP_low);
}

在第一次调用该函数时,它返回正确的值。但在第二遍中,第一遍的值被附加到第二遍,即sender_IP_low的长度变为32。

我该如何解决这个问题?

谢谢

【问题讨论】:

  • 您是否使用 printf() 打印?
  • 几件事:1/main 第一行的逗号是什么? 2/为什么没有指定数组的长度?

标签: c pointers return


【解决方案1】:

看起来您正在将sender_IP_low 打印为字符串,并且由于它不是以空值结尾的,因此打印例程会继续打印相邻的缓冲区sender_IP_hi。而且您可能很幸运,打印例程找到零并在分段错误之前停止。

一个快速的解决方法是:

void int2bin(u_int16_t addr_IP, char *Binary) {
    ...

    Binary[16] = 0; // terminate the string before returning
}

...

char  sender_IP_hi[17], sender_IP_low[17]; // +1 for null terminator

虽然在您的实施中还有一些其他问题可以修复,但我只想专注于回答您最初的问题。

【讨论】:

  • 谢谢艾特斯!有效!您提到了修复代码中的其他内容。您能否告诉我还可以做些什么来改进实施。谢谢!
  • @Ritesh Banka:您可以简单地增加Binary 指针,而不是用计数器偏移它;并使用从 0x8000 开始并在每次迭代中右移的位掩码,以便您可以输出从高到低的位,而不是使用 15 - count 技巧。无论如何,您的代码在功能上是正确的,我的建议只是个人风格的问题。
【解决方案2】:

如果您使用 printf() 打印数组:

void int2bin(u_int16_t addr_IP, char *Binary)
{
    int count;
    printf("IP1add = %d \n", Binary);
    for (count = 0; count < 16; count++) {
        if(addr_IP>0)
            *(Binary + 15-count) = addr_IP & 0x1 ? '1':'0';
        else
            *(Binary + 15-count) = '0';

          addr_IP>>=1;
    }   
    // Put the NULL char in the last position
    Binary[16] = '\0';
}

int main(int argc, char *argv[])
{
    u_int16_t senderIP_16[], u_int16_t receiverIP_16[];
    // One more char for storing the terminator character
    char  sender_IP_hi[17], sender_IP_low[17];
    int2bin(senderIP_16[0], &sender_IP_hi);
    int2bin(senderIP_16[1], &sender_IP_low);
}

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 2014-09-16
    • 2013-05-04
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 2015-12-24
    相关资源
    最近更新 更多