2015-11-24 5 views
2

Я пытаюсь изменить элементы массива в функции. Это прекрасно работает, когда хранится в главном, но когда я переношу его в функцию, которую он segfaults после доступа к первому члену массива.Передача указателя на массив функции

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

#include <stdio.h> 
#include <stdlib.h> 

typedef struct { 
    unsigned short id; 
} voter; 

void initialise(voter** votersPtr, unsigned short *numOfVoters) { 
    *votersPtr = malloc(sizeof(voter)*(*numOfVoters)); 

    for(int i = 0; i < *numOfVoters; i++) { 
     votersPtr[i]->id = (unsigned short) i; 
     printf("%hu \n", votersPtr[i]->id); 
    } 
} 

int main(void) { 
    unsigned short numOfVoters = 480; 
    voter* voters = NULL; 

    initialise(&voters, &numOfVoters); 

    return EXIT_SUCCESS; 
} 

Любая помощь была бы принята с благодарностью, спасибо.

+1

Один из способов избежать такого рода ошибок состоит в том, чтобы функция 'initialize' начиналась с' voter * ptr = malloc ... ', а затем в конце делала' * votersPtr = ptr; '. IMHO делает код более легким для чтения, а также означает, что если вам придется отменить функцию по какой-то причине частично путем построения результата, вы не получите вызывающего абонента, который видит частично построенный результат. –

ответ

0

Тип voter ** неоднозначно либо указатель на массив указателей на объекты voter или указатель на указатель на массив объектов voter. Ваш код использует его как первый, но должен использовать его как второй. Изменение

votersPtr[i]->id = ... 

в

(*votersPtr)[i].id = ... 

и все должно работать.

+0

Благодарим вас за объяснение, почему я не могу использовать «->», теперь я понимаю проблему. – User

0

Помните, что votersPtr является указателем на указатель массива.

Так не в следующей строке следует:

votersPtr[i]->id = (unsigned short) i; 

Вместо быть:

(*votersPtr)[i].id = (unsigned short) i; 
+0

Спасибо! Я действительно попробовал это и забыл изменить его в выражении printf, в результате чего segfault все еще происходит. – User

2

votersPtr[i]->id, который является таким же, как (*votersPtr[i]).id должен быть (*votersPtr)[i].id.