Постоянный массив указателей со структурными полями, которые могут указывать на выделенные поля malloc? - PullRequest
0 голосов
/ 09 апреля 2011
int main() {    
    Employee *array[SIZE]; //Employee is a typedef struct --includes char *name, DATE *dateOfBirth, DATE is also a typedef struct, has 3 int fields month, day, year,`  

fillArray(array, &count, fpin1, fpin2);

freeMemory(array, int count);

}  

fillArray(Employee *array[], int *count,  FILE *fpin1, FILE *fpin2)  
    char buffer[MAX], buffer2[MAX];  
    while (fgets(buffer, MAX, fpin1) != NULL && fgets(buffer2, MAX, fpin2) != NULL){  
        array[*count]->name = (char *) malloc(sizeof(char)*25);  
        assert(array[*count]->name != NULL);  
        strncpy(array[*count]->name, buffer, 15);  

        strncpy(buffer2, temp, 2);
        array[*count]->dateOfBirth->day = atoi(temp)
}

Код компилируется, но продолжает сбой из-за ошибки сегментации, кажется, что он не работает на моих fgets? или мой malloc, что я делаю не так? Я действительно не могу понять это.

Также, как бы вы освободили эту память в

freeMemory(Employee *array[], int count)

функция

Ответы [ 2 ]

0 голосов
/ 09 апреля 2011
Employee* array[SIZE];

Это массив, в котором хранятся указатели на Employee структуры.

Я думаю, что вы имеете в виду

fillArray(Employee* array[], int* count,  FILE *fpin1, FILE *fpin2)
{
    char buffer[MAX], buffer2[MAX];
    int i = 0;
    while ( fgets(buffer, MAX, fpin1) != NULL && 
            fgets(buffer2, MAX, fpin2) != NULL )
    {
        // the array does not hold any valid memory address.
        array[i] = malloc( sizeof(Employee) );
        assert( array[i] != NULL );

        // now on the new employee add some char memory
        (array[i])->name = malloc( sizeof(char) * 25 );
        assert(array[i]->name != NULL);

        strncpy(array[i]->name, buffer, 15);
        strncpy(buffer2, temp, 2);

        array[i]->dateOfBirth->day = atoi(temp)

        ++i;
        (*count)++; 
    }  
}

выполнение array[*count] помимо странного вида, всегда изменяет одно и то жеиндекс.Вы никогда нигде не изменяли *count.

Этот код не проверяет, что вы не превышаете границы пройденного array.

Также: для freeMemory()

freeMemory(Employee* array[], int count)
{
    int i = 0;
    while( i < count )
    {
        free(array[i]);
        array[i] = NULL;
        ++i;
    }  
}
0 голосов
/ 09 апреля 2011

Должно быть:

int main() {    
    Employee array[SIZE]; //Employee is a typedef struct --includes char *name, DATE *dateOfBirth, DATE is also a typedef struct, has 3 int fields month, day, year,`  

fillArray(&array, &count, fpin1, fpin2);

freeMemory(&array, int count);

}  

Вы нигде не размещаете свои Employee объекты, поэтому массив [0] указывает на некоторый случайный адрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...