从函数返回数组

时间:2011-02-08 03:45:39

标签: 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)
            *(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。

我该如何解决这个问题?

由于

2 个答案:

答案 0 :(得分:3)

看起来您正在将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

虽然您的实施中还有其他一些可以解决的问题,但我只想集中精力回答您原来的问题。

答案 1 :(得分:1)

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