我已被分配去为我们的学校防务制定一个有效的学生选举计划(可能还有实际用途……)。但是,我已经困扰了一段时间了。
我的目标是制作一个灵活的结构数组,因为我不能使用任意限制,所以数组对我来说也有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 ++,如果可以的话,我想我可能会更容易做到这一点
答案 0 :(得分:0)
问题根本与内存分配无关!发生问题是因为我一直在分配候选人[-1],我已将candidates[can_c - 1]
放入candidates[can_c]
内存中。
感谢大家的帮助! (还有@someprogrammerdude指出了这一点)