纯C-传递结构指针的参考



我创建了一个程序,该程序正在加载来自键盘中的学生信息的数据库,此后,我正在尝试创建一个选项,以将学生添加到该数据库

结构由

组成
typedef struct {
    long unsigned int aem;
    char name[64];
    short unsigned int lessonsToPass;
} Registration;

我在主函数上创建了一个指针

int i, sizeOfDatabase;
Registration *database
scanf("%d", &sizeOfDatabase);
database = (Registration*) malloc(sizeOfDatabase * sizeof(Registration));
for(i = 0; i < sizeOfDatabase; ++i){
    scanf("%lu%63s%hu", &(database+i)->aem, (database+i)->name, &(database+i)->lessonsToPass);
    for(tmp = (database+i)->name; (*tmp=toupper(*tmp)); ++tmp);
}

基本上,我从键盘获取数据库,并将名称归为大写

之后,我正在调用一个函数以添加新注册

void add(char *aem, char *name, char *lessonsToPass, int currentDatabaseSize, Registration **database){
    char *tmp;
    int newSize = currentDatabaseSize + 1;
    *database = (Registration*) realloc(*database, newSize * sizeof(Registration));
    for(tmp = name; (*tmp=toupper(*tmp)); ++tmp);
    (*database + newSize)->aem = atoi(aem);
    strcpy((*database + newSize)->name, name);
    (*database + newSize)->lessonsToPass = atoi(lessonsToPass);
}

char *名称永远不会大于64,我仍在汇编错误 malloc(): corrupted top size

我缺少什么?

(*database + newSize)->aem = atoi(aem);

刚刚注销了分配的块,因为newSize包含分配的记录的数量,包括现在创建的记录。正确的代码:

(*database + newSize - 1)->aem = atoi(aem);
strcpy((*database + newSize - 1)->name, name);
(*database + newSize - 1)->lessonsToPass = atoi(lessonsToPass);

您选择了一些不寻常的成语来表示您要做的事情。这是更易于理解的代码并解决了问题。请注意,我假设您有一个现代的C编译器。代码的样式是C89。那是1989年。如果是一种选择,则应使用较新的C语言功能。

首先制作一个字符串大写方法来防止重复代码:

void strtoupper(char *s) {
  for (char *p = s; *p; ++p) *p = toupper(*p);
}

现在其余的:

int sizeOfDatabase;
Registration *database;
scanf("%d", &sizeOfDatabase);
database = malloc(sizeOfDatabase * sizeof *database); // NO CAST HERE!
for (int i = 0; i < sizeOfDatabase; ++i){
  Registration *r = database + i;
  scanf("%lu%63s%hu", &r->aem, r->name, &r->lessonsToPass);
  strtouper(r->name);
}

您应该将指针传递到数据库大小,以便add方法可以对其进行更新。当您以您的操作方式调用realloc时,这是效率低下的,因为每个调用都需要与整个数据库大小成比例的时间。如果它变得很大,您会后悔的。但这是我们忽略的好点。

void add(char *aem, char *name, char *lessonsToPass,
  Registration **database, int *dbSize) {
  int i = (*dbSize)++; // Increase db size by 1 and get new element's index.
  Registration *db = *database = realloc(*database, *dbSize * sizeof **database);
  Registration *r = db + i;
  strcpy(r->name, name);  // DON'T MODIFY THE INPUT.
  strtoupper(r->name);
  r->aem = atoi(aem);
  r->lessonsToPass = atoi(lessonsToPass);
}

我希望这是有道理的。

相关内容

  • 没有找到相关文章

最新更新