C 从函数返回数组

C 从函数返回数组,c,pointers,return,C,Pointers,Return,我正在写一个函数,它接受整数值和指向字符的指针。 该函数将整数值转换为二进制,并将其存储在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)

我正在写一个函数,它接受整数值和指向字符的指针。 该函数将整数值转换为二进制,并将其存储在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);
}
在对函数的第一次调用中,它返回正确的值。但是在第二次传递中,第一次传递的值被附加到第二次传递,即发送方的长度变为32

我如何解决这个问题


谢谢

看起来您正在将sender\u IP\u low打印为字符串,并且由于它不是以null结尾的,因此打印例程将继续打印相邻的缓冲区sender\u IP\u 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

尽管在您的实现中还有一些其他问题可以解决,但我只想重点回答您最初的问题。

看起来您正在将sender\u IP\u low打印为字符串,并且由于它不是以null结尾的,所以打印例程将继续打印相邻的缓冲区sender\u IP\u 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

尽管在您的实现中还有一些其他问题可以解决,但我只想重点回答您最初的问题。

如果您使用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);
}

如果使用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);
}

你是用printf打印的吗?几件事:1/main的第一行中的逗号是什么?2/为什么不指定数组的长度?是否使用printf打印?几件事:1/main的第一行中的逗号是什么?2/为什么不指定数组的长度?谢谢!成功了!您提到了修复代码中的其他内容。你能告诉我还能做些什么来改进实施吗。谢谢@Ritesh Banka:您可以简单地增加二进制指针,而不是使用计数器对其进行偏移;并使用一个从0x8000开始并在每次迭代时右移的位掩码,这样就可以将位hi输出到low,而不是使用15计数技巧。无论如何,你的代码在功能上是正确的,我的建议只是个人风格的问题。谢谢!成功了!您提到了修复代码中的其他内容。你能告诉我还能做些什么来改进实施吗。谢谢@Ritesh Banka:您可以简单地增加二进制指针,而不是使用计数器对其进行偏移;并使用一个从0x8000开始并在每次迭代时右移的位掩码,这样就可以将位hi输出到low,而不是使用15计数技巧。不管怎样,您的代码在功能上是正确的,我的建议只是关于风格的个人品味问题。