Возврат массива из функции - PullRequest
1 голос
/ 08 февраля 2011

Я пишу функцию, которая принимает целочисленное значение и указатель на символ. функция преобразует целочисленное значение в двоичное и сохраняет его в указателе символа. указатель на символ имеет длину 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 ]

3 голосов
/ 08 февраля 2011

Похоже, вы печатаете 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 голос
/ 08 февраля 2011

Если вы печатаете массивы с помощью 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);
}
...