我被指派为我们的学校辩护制定一个有效的学生选举计划(可能用于实际使用......但是,我已经遇到一个问题一段时间了。
我的目标是制作一个灵活的结构数组,因为我不能使用任意限制,数组对我来说也有 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%sn%sn%un", 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],我已经把candidates[can_c - 1]
放在candidates[can_c]
内存中。
感谢所有帮助过的人!(并@someprogrammerdude指出(