2014-11-28 2 views
1

я хочу написать программу в C через Bluez APIцелое число в C Получить случайное значение

Я использовал это site для урока:

и это мой код:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/socket.h> 
#include <bluetooth/bluetooth.h> 
#include <bluetooth/hci.h> 
#include <bluetooth/hci_lib.h> 


int main(int argc, char **argv) 
{ 
    int dev_id = hci_get_route(NULL); 
    int res_scan=NULL; 
    int count; 
    inquiry_info *device_info=NULL; 
    res_scan = hci_inquiry(dev_id,3,255,NULL,&device_info,IREQ_CACHE_FLUSH); 
    printf("%i\n",res_scan); 
    for(count = 0;count < res_scan;count++) 
    { 
     char *name; 
     printf("count Before : %i\n",count); 
     ba2str(&(device_info+count)->bdaddr,&name); 
     printf("count After : %i\n",count); 

     printf("%s\n",&name); 
    } 



} 

и из консоли :

2 
count Before : 0 
count After : 1111833143 
00:17:EB:5D:1B:86 

count почему значение после ba2str(&(device_info+count)->bdaddr,&name); получить случайное значение?

в этом источнике я связал эту проблему не случайно!?

+3

Вы не выделили память для 'name' ... –

+0

Вас беспокоило, что может сделать' ba2str'? – Wolf

ответ

2

Вам необходимо выделить память, прежде чем передать переменную в качестве ссылки, и лучшим вариантом является, чтобы сделать это из петли.

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/socket.h> 
#include <bluetooth/bluetooth.h> 
#include <bluetooth/hci.h> 
#include <bluetooth/hci_lib.h> 


int main(int argc, char **argv) 
{ 
    int dev_id = hci_get_route(NULL); 
    int res_scan=NULL; 
    int count; 
    char *name = (char *) malloc(248*sizeof(char)); 
    inquiry_info *device_info=NULL; 
    res_scan = hci_inquiry(dev_id,3,255,NULL,&device_info,IREQ_CACHE_FLUSH); 
    printf("%i\n",res_scan); 
    for(count = 0;count < res_scan;count++) 
    { 
     printf("count Before : %i\n",count); 
     ba2str(&(device_info+count)->bdaddr,name); 
     printf("count After : %i\n",count); 

     printf("%s\n",name); 
    } 

free(name); 

} 

Выполнение этого кода будет быстрее, потому что вы выделите память только один раз.

+0

запомнить очистить с помощью 'memset' перед использованием' ba2str' – Eun

+0

Зачем выделять имя в куче? – Wolf

+0

Я предполагаю, что функция ba2str попробует написать что-то на имя переменной, поэтому вам нужно будет выделить ее, но ее также можно использовать для обозначения имени [248], но всегда из цикла. – Alex

5

вместо

char *name; 
... 
printf("%s\n",&name); 

использования

char name[248] = { 0 }; 
... 
printf("%s\n",name); 
+0

и, вероятно, также просто «имя» вместо '& name' –

+0

@JensGustedt no' ba2str' требует указателя для обоих аргументов. – Eun

+0

Да, массив в этом контексте распадается на указатель. Или вы имеете в виду указатель на указатель? Это окончательно неправильно для вызова 'printf'. –