2016-05-09 3 views
-4

+ Я пытаюсь перейти от основного массива CustomStruct по ссылке, но я делаю что-то неправильно:Передача STRUCT * ссылочной C

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

void readFile(OwnStruct **restaurant){ 

    FILE *f;                                                
    int numTaules = 0;                                             
    f = fopen("hello.txt", "r");                                          
    if(f == NULL){                                              
     printf("Error at opening!\n");                                       
     exit(0);                                               
    }                                                 

    fscanf(f,"%d",&numTaules);                                           

    //Asking for memory                                                
    *restaurant = (OwnStruct*)malloc(sizeof(OwnStruct) * numTaules);                                    

    //From here, at some point: Core Dumped                                               
    restaurant[0]->ocupades = 1;                                           
    restaurant[0]->disponibles = 2;                                          
    restaurant[1]->ocupades = 3;                                           
    restaurant[1]->disponibles = 4;                                          
    printf("%d\n",restaurant[0]->ocupades);                                        
    printf("%d\n",restaurant[0]->disponibles);                                       
    printf("%d\n",restaurant[1]->ocupades); 
    printf("%d\n",restaurant[1]->disponibles); 

} 

int main(){ 

    typedef struct(){ 
     int ocupades; 
     int disponibles; 
    } 

    OwnStruct *restaurant; 

    readFile(&restaurant); 
    return 0; 
} 
+1

Вы должны убедиться, что перед номером 'numTaules' должно быть не менее 2. – owacoder

+1

это невозможно скомпилировать. – BLUEPIXY

+1

'typedef' находится не в том месте. Функция пропускает неправильное количество аргументов. Пожалуйста, напишите [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve), который показывает, что вы пробовали. «Core dumped» означает, что ваш несовместимый код не является вашим фактическим кодом. –

ответ

1

Ваша проблема в том, что функция

void readFile(char fileName[], OwnStruct **restaurant) 

ожидает два параметра, но вы передаете только один.

readFile(&restaurant); 

Просто напишите

readFile("myFile.txt", &restaurant); 

или определить функцию

void readFile(OwnStruct **restaurant) 
3

Вы ссылающийся неверном массива:

До сих пор так хорошо:

*restaurant = (OwnStruct*)malloc(sizeof(OwnStruct) * numTaules);                   

Это неправильно:

restaurant[0]->ocupades = 1;   

Оно должно быть:

(*restaurant)[0].ocupades = 1; 

Вы должны разыменования указателя на указатель. Затем это выражение указывает на первый элемент выделенного массива. Скобки необходимы, поскольку операторы постфикса, такие как EXPR[0], имеют приоритет над унарными операторами, такими как *EXPR, поэтому *EXPR[0] рассматривается как *(EXPR[0]).

Рекомендация: Работа с локальным указателем, который является только Ownstruct *ptr. Тогда, как раз перед возвращением из функции, хранить этот указатель:

*restaurant = ptr; 

Тогда вы можете просто иметь код ptr[0]->field = value типа в вашей функции.

+1

Должно ли быть '(* ресторан) [0] .ocupades'? – kaylum

+0

Да! это (* ресторан) [0] .ocupades Спасибо большое! PD: Я уже сделал это с локальным указателем, но я хотел знать, почему он не работал как прокомментированный. Опять же, большое спасибо! – Marchu

+0

@kaylum Да, извините; конечно, если мы имеем '->', '[]' ** и ** '*', то мы * triple * разыменовываем! – Kaz

0

Пример, который вы даете, в настоящее время не компилируется - readFile ожидает имя файла и указатель на указатель OwnStruct. Ваша основная задача - предоставить указатель.

структура должна определить где-то в верхней части (до его использования в основной и ReadFile)

ReadFile также чтение numTauls из файла, но затем предполагая, что по крайней мере, 2, при назначении значения выделенной памяти.

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