realloc () недопустимый старый размер в массивах структур - PullRequest
0 голосов
/ 25 сентября 2019

Мне было поручено составить действующую программу выборов учащихся для защиты нашей школы (и, вероятно, для фактического использования ...).Однако я уже некоторое время сталкиваюсь с проблемой.

Моя цель - создать гибкий массив структур, поскольку я не могу использовать произвольное ограничение, также массивы имеют ограничение в 99 элементов дляя (* см. конец поста).Я использовал realloc (), но это дает abort () для недопустимого старого размера.НО, я попытался протестировать динамический массив структуры в другой программе, и он работал безупречно.Я не могу понять, что вызывает сбой другого.

Моя предвыборная программа (т. Е. Сбойная):

ПРИМЕЧАНИЕ: функция entr_cmd просто перемещает курсор вниз.экрана и печатает текст, а STREQL просто видит, совпадают ли две строки, просто макрос быстрого вызова для strcmp

struct candidate {
    long lrn;
    char *name;
    int grade;
    char *section;
    char *party;
    char *position;
}
**candidates,
// :: Temporary Array for storing all the candidates in the position to be voted in
**candidates_cur;
int can_c = 0;

[...]

int main() {
[...]
    candidates = malloc(2 * sizeof(struct candidate *));
[...]
            if(STREQL(command, "c")) {
                        struct candidate *c;

                        if(can_c > 1) {
                            struct candidate **tmp;
                            tmp = (struct candidate**) realloc(candidates, (1 + can_c) * sizeof(struct candidate *));

                            if(tmp != NULL) candidates = tmp;
                        }

                        candidates[can_c - 1] = malloc(sizeof(struct candidate *));
                        c = candidates[can_c - 1];

                        entr_cmd("Candidate's Name: ");
                        // :: This recieves the input but replaced for testing
                        c->name = malloc(4 * sizeof(char));
                        strcpy(c->name, "XXX");

                        can_c++;
            }
[...]

Тестовая программа, которая работает без нареканий:

это генерирует случайную строку чисел для членов тестовой структуры

struct test {
    char *name;
    char *another;
    int test;
} **arr;

int main() {
    int r1;

    arr = malloc(2 * sizeof(struct test *));

    r1 = rand() % 45;
    for(int i = 0; i < r1; i++) {
        int r2 = rand() % 22;

        if(i > 2) {
            struct test **data;
            data = (struct test**) realloc(arr, (2 + i) * sizeof(struct test*));

            if(data != NULL) {
                arr = data;
            }
        }

        arr[i] = malloc(sizeof(struct test *));
        struct test *t = arr[i];
        t->name = malloc(r2 * sizeof(char));
        t->another = malloc(r2 * sizeof(char));
        t->test = r2;

        for(int ii = 0; ii < r2; ii++) {
            t->name[ii] = (char) (rand() % 9) + '0';
            t->another[ii] = (char) (rand() % 9) + '0';
        }

        printf("====[%u]====\n%s\n%s\n%u\n", i, arr[i] -> name, arr[i] -> another, arr[i] -> test);
    }

    for(int i = 0; i < r1; i++) {
        free(arr[i]->name);
        free(arr[i]->another);
        free(arr[i]);
    }

    free(arr);
    getch();
}

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

Спасибо за чтение и хорошего дня !!!

дополнительные бессмысленные: я 'Я в курсе, где мы регулярно используем TurboC ++ для программирования, но это довольно сложно сделать там, поэтому я вместо этого использовал C99 с моей настройкой neovim, чтобы я мог иметь быструю навигацию, а также большинство вещей в C99 могут работать в TurboC ++.Другими словами, я не могу по-настоящему работать с (недавним стандартом) C ++, если это так, я думаю, я бы, вероятно, сделал бы это легче

1 Ответ

0 голосов
/ 25 сентября 2019

Проблема вообще не связана с выделением памяти!Проблема возникает из-за того, что я продолжаю выделять кандидатов [-1], я поместил candidates[can_c - 1] в candidates[can_c] память.

Спасибо всем, кто помог!(и @someprogrammerdude за указание на это)

...