2015-03-14 4 views
2

Я не могу получить доступ к своему указателю на индексный указатель в Основная функция. То, как я передаю указатель как параметр к функциям, верно? Я пробовал без &, и он тоже не работал. Вот мой код:Выделить память динамически из вектора структуры

//My Struct 
typedef struct{ 
    int a; 
    double d; 
    char nome[20]; 
}contas; 

//Function to allocate memory 
void alloca_vetor(contas *acc, int linhas){ 
    acc = malloc(linhas * sizeof(contas)); 

    if(acc == NULL){ 
     printf("ERRO AO ALOCAR MEMORIA\n"); 
     exit(0); 
    } 

    printf("ALLOCATION SUCCESSFUL"); 
} 

//Function to fill the vector 
void fill_vetor(contas *acc, int linhas){ 
    int i,a; 

    for(i=0; i< linhas; i++){ 
     acc[i].a = i; 
    } 
    printf("FILL SUCCESSFUL !\n"); 

    for(i=0; i< linhas; i++){ 
     printf("%i\n", acc[i].a); 
    } 
} 

int main() 
{ 
    int i, num_linhas = 5; 
    contas *array; 

    alloca_vetor(&array, num_linhas); 
    fill_vetor(&array, num_linhas); 

// ERROR HAPPENS HERE - Segmentation Fault 
    for(i=0; i < num_linhas; i++){ 
     printf("%i\n", array[0].a); 
    } 

    free(array); 
    return 0; 
} 

ответ

3

функция Rewrite alloca_vetor следующим образом

void alloca_vetor(contas **acc, int linhas){ 
    *acc = malloc(linhas * sizeof(contas)); 

    if(*acc == NULL){ 
     printf("ERRO AO ALOCAR MEMORIA\n"); 
     exit(0); 
    } 

    printf("ALLOCATION SUCCESSFUL"); 
} 

и функции вызова fill_vetor как

fill_vetor(array, num_linhas); 
+0

Спасибо. Теперь вы могли бы объяснить мне это? Что такое '**' acc. Что-то вроде указателя, указывающего на другой указатель? e.e – PlayHardGoPro

+0

@PlayHardGoPro Массив массива contas * должен быть передан функции по ссылке. В этом случае любые изменения массива в функции будут отражаться на исходном массиве. Таким образом, если у вас есть массив contas * объявления; то указатель на этот объект будет иметь тип contas ** ; –

+0

Эй, у меня ошибка «Ошибка сегментации». Но когда я добавил '&' в вызывающую строку, похоже, что сработало. Это правильно ? – PlayHardGoPro

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