realloc()结构数组上的旧大小无效

时间:2019-09-25 12:35:44

标签: c arrays malloc c99 realloc

我已被分配去为我们的学校防务制定一个有效的学生选举计划(可能还有实际用途……)。但是,我已经困扰了一段时间了。

我的目标是制作一个灵活的结构数组,因为我不能使用任意限制,所以数组对我来说也有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 ++进行编程的课程中,但是在那儿很难做到这一点,所以我在Neovim设置中使用了C99,这样我就可以进行快速导航和C99中的大多数功能也可以在TurboC ++中工作。换句话说,我不能真正使用(最新标准)C ++,如果可以的话,我想我可能会更容易做到这一点

1 个答案:

答案 0 :(得分:0)

问题根本与内存分配无关!发生问题是因为我一直在分配候选人[-1],我已将candidates[can_c - 1]放入candidates[can_c]内存中。

感谢大家的帮助! (还有@someprogrammerdude指出了这一点)