2013-08-02 2 views
0

Я продолжаю получать разыменование нулевого указателя, а затем панику ядра. Может кто-нибудь мне рассказать, как обойти это.Указатели разыменовывают доступ к массиву в другом файле

файл 1.c:

int get_data() 
{ 
    int i; 
    int *mv; 
    unsigned long *f; 

     if ((get_data_from_other_file(&mv, &f)) { 
       return error; 
     } 

     for (i=0; mv[i]; i++) 
        printf("%d %lu", mv[i], f[i]); 
} 

file2.c:

struct data 
{ 
    .mv = { 1,2,3,4,5 }, 
    .f = {4,5,5,3,2}, 
}datas; 

int get_data_from_other_file(int **mv, unsigned long **f) 
{ 
     *mv = datas.mv; 
     *f = datas.f; 

     for (int i =0; datas.mv[i]; i++) 
       printf ("%d %lu \n", *(mv[i]), *(f[i])); 

      return 0; 
} 

Я просто хочу, чтобы иметь возможность получить доступ к данным из file2 в file1 без использования таНос или новый, или что-нибудь подобное что.

+0

A * ядро ​​паника *? Где выполняется этот код? – phs

+0

Это внутри ядра – user2167767

+0

Я пытаюсь сделать что-то внутри ядра Android. Как-то я не могу получить доступ к malloc в этом файле. Пробовал использовать #include не работает. – user2167767

ответ

0

Здесь printf ("%d %lu \n", *(mv[i]), *(f[i])); вы разыскиваете неверные адреса. mv[i] и f[i] - это номера, которые вы положили в свою структуру datas (1,2,3,4, ..). Применяя к ним оператор *, вы пытаетесь получить доступ к памяти по указанному адресу (1,2,3,4 ..). Это явно неправильно, поскольку эти адреса не являются вашими - они зарезервированы для использования системы и содержат важную информацию, которая защищена.

Не совсем понятно, что вы на самом деле пытаетесь сделать, но я не вижу ссылки на файл в вашем коде.

Замена malloc: вместо этого в ядре вы должны использовать kmalloc.

+0

ну а вывод printk во втором файле - это просто посмотреть, правильно ли оно заполняется. В 1-м файле я пропустил отправку двойных указателей в вызов функции. Удаление его во втором файле исправляет его. – user2167767

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