2015-04-02 2 views
2

У меня есть такая иерархия:С указателями таНос внутри вызова функции

main() 
{ 
    int i; 
    myStruct *devices = NULL; 
    myFunc1(&devices); 

    for (i = 0; i < 5; i++) 
    { 
     printf("MAC: %s, Name: %s, COD: %s\n\r", devices[i].field1, devices[i].field2, devices[i].field3); 
    } 
} 

void myFunc1(myStruct **devices) 
{ 
    myFunc2(devices); 
} 

void myFunc2(myStruct **devices) 
{ 
    int i; 
    *devices = malloc(sizeof(myStruct) * 5); 

    for (i = 0; i < 5; i++) 
    { 
     (*devices[i]).field1 = "test1"; 
     (*devices[i]).field2 = "test2"; 
     (*devices[i]).field3 = "test3"; 
    } 
} 

В главной, когда я доступ к устройствам [I] с = 0, то это нормально, но когда я> 0 Segfault происходит, и могу не понимаю, как получить к нему доступ правильно.

+0

Compile со всеми предупреждениями и отладочной информации ('НКУ -Wall -Wextra -g'). ** Используйте отладчик ** ('gdb') и [valgrind] (http://valgrind.org/), если они доступны. –

+1

@ Дабо: нет, это ошибка компиляции. очевидно, что код не является полным. –

ответ

4

Из-за operator precedence выражение *devices[i] разобрано как *(devices[i]), что не совсем то, что вы хотите. Вместо этого вы хотите использовать (*devices)[i].

+0

Спасибо. Борьба с этим в течение некоторого времени, никогда не думал, что проблема заключается в назначении. :) –

3

Я совершенно уверен,

(*devices[i]) 

Должно быть

((*devices)[i]) 

Поскольку оператор [] имеет приоритет над * оператора. Вы хотите разыменовать указатель, а затем получить доступ к массиву.

0

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

*devices[i]).field1 

Для

*devices[i])->field1 
Смежные вопросы