пытаясь сохранить массив указателей - PullRequest
0 голосов
/ 29 сентября 2010
struct match
{
    char men[64];
    char women[64];
    char menNum[1000];
    char woNum[1000];
};

void printOut();
int matchMaking(struct match* p, struct match* q, int k);
int main(void)
{
    FILE* fin;
    FILE* fout;
    fin = fopen("input.txt", "r");
    fout = fopen("out.txt", "w");
    int matchNum = 0;
    int size;
    int i;
    int j;
    int a;
    struct match* ptrName;
    struct match** ptrNum;
    char* str;
    char temp[800];

    if(fin == NULL)
        printf("Cannot Find File");

    fgets(temp, 800, fin);
    str = (char*)malloc(sizeof(char));
    str = (char*)strtok(temp, " \n");
    size = atoi(str);
    printf("Size = %d\n", size);

    ptrName = (struct match*)malloc(size*sizeof(struct match));
    ptrNum = (struct match**)malloc(size*sizeof(struct match*));

    for(i = 0; i < size; i++)
    {

        fgets(temp, 800, fin);
        str = (char*)strtok(temp, " \n");
        matchNum = atoi(str);
        printf("Match Num = %d\n", matchNum);
        fgets(temp, 800, fin);
        strcpy(ptrName->men, temp);
        printf("Name = %s\n", ptrName->men);
        fgets(temp, 800, fin);
        strcpy(ptrName->women, temp);
        printf("Name = %s\n", ptrName->women);

        for(j = 0; j<matchNum; j++)
        {
            fgets(temp, 800, fin);
            strcpy(ptrNum[j]->menNum, temp);
            printf("Men Num = %d\n", ptrNum[j]->menNum);
        }

при отладке я получаю ошибку сегментации как ошибку

Ответы [ 2 ]

2 голосов
/ 29 сентября 2010

Грубо говоря, я бы сказал, что проблема здесь:

ptrNum = (struct match**)malloc(size*sizeof(struct match*));

Что вам действительно нужно, так это достаточно памяти для size числа struct match, а не size количества указателей.Затем вы хотите индексировать в это пространство.

По сути, вы должны сделать что-то вроде

struct match* ptrNum = malloc(size*sizeof(struct match));

Это даст вам блок памяти для size числа структур и даст вамуказатель на первый.Вы можете использовать сокращенную запись «массива» для индексации в этой памяти, поэтому match[0] дает вам структуру в позиции 0 в «массиве», а match[j] дает запись в j -й позиции.

Также обратите внимание, что match[j] возвращает вам реальную память, поэтому вы не захотите использовать обозначение указателя:

strcpy(ptrNum[j].menNum, temp);
0 голосов
/ 29 сентября 2010

Вы выделяете массив указателей, но вы никогда не устанавливаете эти указатели на что-либо!Ваш звонок на strcpy(ptrNum[j]->menNum, temp); будет писать на случайный адрес, так как каждая из ваших записей в ptrNum [] не инициализирована.

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