2011-02-08 4 views
1

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

Как это можно решить?

Благодаря

+0

, что вы пытаетесь сделать? –

+1

Вы печатаете с помощью printf()? –

+0

Немного вещей: 1/что это за запятая в первой строке 'main'? 2/почему длина массивов не указана? – Peyman

ответ

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 

Хотя, есть несколько других вещей, которые могут быть закреплены в вашей реализации, я просто хотел, чтобы сосредоточиться на ответе на исходный вопрос.

+0

Спасибо Ates! Это сработало! Вы упомянули об исправлении других вещей в коде. Не могли бы вы рассказать мне, что еще можно сделать для улучшения реализации. Благодаря! –

+0

@Ritesh Banka: вы можете просто увеличить указатель 'Binary' вместо того, чтобы компенсировать его счетчиком; и использовать битовую маску, которая начинается с 0x8000 и получает каждую смещение по правому сдвигу, так что вы можете выводить бит hi-to-low вместо использования трюка '15-count'. Во всяком случае, ваш код функционально корректен, и то, что я предлагаю, - это всего лишь вопрос личного вкуса стиля. –

1

Если вы печатаете массивы с Е():

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); 
} 
+0

Спасибо Мурило! Решение сработало. :) –

Смежные вопросы